您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 10564|回复: 2
打印 上一主题 下一主题

[C] C语言 socket 编写简单服务端客户端通信问题

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。3 f& _# x1 q3 p# {% g
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
; T! x5 z2 H2 k  l6 B8 N2 H3 x. gTalk is cheak , show me the code.9 j9 \' P0 {- D8 L2 X5 u. s  v; e
服务端代码:
6 E  i( L' y4 S" N1 u
  1. #include<stdlib.h>0 j. x& X/ O6 A+ n/ K1 U8 t* V) P1 q( Z
  2. #include<WinSock2.h>
    4 j- i5 D& t: y
  3. #pragma comment(lib,"ws2_32.lib")# y+ |( f& u' Z( i. u
  4. int main(){' Y2 n) o" G+ p: b  M5 V4 p! Z1 y9 `
  5.     WSADATA wsd;: V4 |% W( \) l4 F( s" o! l
  6.     SOCKET sockServer;- S$ a8 f9 B* l8 V' S2 z
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号) Y7 d3 b. R8 C9 h1 T
  8.     SOCKET sockClient;; `) o/ w7 y1 Z8 @0 d7 Y
  9.     SOCKADDR_IN clientaddr;; I5 w% K. a; S: [5 ?: q! @/ _4 U, p7 R
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口& ~, F% E4 h3 [3 p+ J4 j
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket4 _& U3 y6 }; H9 A1 F, s% u: j

  12. 5 ^, L* ]* Z: l* F3 T
  13. 3 V5 P: r1 Z& ?
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    % N, i- @  e) c0 P8 q& d
  15.         printf("Socket has been created :%d", sockServer);+ ^% P4 V7 ]8 f1 s
  16.     }& ]" q6 W) W( @& k" N
  17.     else{8 c. U& R  ^& z4 Y
  18.         printf("Socket create failed.");) k  H/ B* R6 G+ l
  19.         exit(0);; R4 N, {" K* e( X% l0 _/ b6 c
  20.     }  z+ O- g+ F* }7 G3 c: l
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    9 U0 n! W9 g/ u( A
  22.     serveraddr.sin_family = AF_INET;4 O. [4 U' n: l
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
      D+ B/ q1 |5 @& U6 q  \) ]# V( @
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    # X% {* E) r# q: P+ k2 V  I: g
  25.     char recvBuf[100];
    ; y  U3 z( h2 N2 Z) o( ~7 f( z
  26.     int len = sizeof(SOCKADDR);
    : h2 F9 k* J- F
  27.     listen(sockServer, 5);//5为等待连接数
    4 R0 `! h+ u/ H( N( Z2 B
  28.     while (1){5 l3 Y& t" y/ |; o( f
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    1 L  }5 o3 w1 ?" [$ T$ i' Z7 Q8 P
  30.         //接收客户端数据
    - ~3 ~1 q4 n2 u& a9 g4 B: m# T
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);  a# D! [) H& W! C; B6 J7 Y
  32.         printf("to me:%s\n",recvBuf);
    ) @2 U0 ~; t/ i$ \) r
  33.         memset(recvBuf, 0, 100);% r- ?* E+ Y5 W9 v+ o
  34.     }
    1 R5 j6 m) Y0 s/ t0 F6 U& v  C
  35.     closesocket(sockClient);
    0 A/ Y6 \, ?$ ~! t$ M5 B- u0 j1 b# s
  36.     system("pause");: S: e) i8 P7 F3 F0 N$ I
  37.     return 0;# \$ J# i5 `  Y
  38. }
复制代码
客户端代码:
' E) k' v. k) r4 k, Q
  1. #include<winsock2.h>
    ' o8 a/ _  C' L
  2. #include<stdio.h>
    , ?" _" o: ^& ~2 n
  3. #pragma comment(lib, "ws2_32.lib")0 Q& k& D/ r+ K: e0 c% H
  4. void main()3 I9 S+ [0 D6 Z4 p! F: Q, z& x8 g
  5. {: k- ~  t( C& E; h! f  M
  6.     WSADATA wsaData;
    0 [7 f% S, k# _4 H
  7.     SOCKET sockClient;//客户端Socket: ]( X# |# |7 q8 z' k
  8.     SOCKADDR_IN addrServer;//服务端地址, K. e  q9 v5 z$ f( y( A
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    : B1 @1 D7 E4 i$ \" c
  10.     char message[20] = "HelloSocket!";  n* }9 @' e2 @5 u& g: ]
  11.     //定义要连接的服务端地址# Y5 v2 P6 c6 g/ S+ g
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    + ~( G+ T$ ~# I; a, V" h, R* w
  13.     addrServer.sin_family = AF_INET;
    0 ^/ I& x, H2 ]% i
  14.     addrServer.sin_port = htons(6000);//连接端口60009 ^: j6 a9 ~  i6 W% I. D+ A
  15.     //新建客户端socket9 z/ v9 P; ?) k4 ~" e# X$ A
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);  n+ n1 N) X8 _; Z; }( B6 r
  17.     int s = 0;
    4 y2 j. f1 O1 c( n
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    / p: ^7 E! ^/ A
  19. & c, L+ s4 N6 @2 C
  20.     while (1){
    3 _0 C9 N7 S! d5 I8 K9 O
  21.         //发送数据
    * s: A3 m5 }5 P3 ]" G4 J( }5 A
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    5 w4 Q; g6 Y% I/ f( V; b
  23.         printf("to server:");
    6 O5 D2 G% ^9 G4 x
  24.         scanf("%s", message);: I& s/ p4 _8 K6 K1 G1 V
  25. / y9 n2 N1 ]/ ?! Y: Q# _9 `0 q; n
  26.     }4 Q. z' n8 T2 _" [( x. q( H
  27.     //关闭socket
    ) l) m( m, P, t
  28.     closesocket(sockClient);3 s0 q" P2 Y7 ~; q8 T2 Y
  29.     WSACleanup();7 e7 H$ W4 Q2 u5 M0 \8 d
  30. }
复制代码
求懂的高手来解答一下。
( Z, O$ U6 |  t0 `" n谢谢了!
, N. K3 J! B( K

% G, p3 M1 I5 O- E% p
. H- C: `+ ?2 L
" m  Y9 a9 c" z1 g' t- Y2 B' U
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为3 c: ?0 _" W+ {2 G" [* Q/ `
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-19 23:16 , Processed in 0.151054 second(s), 20 queries .

Copyright © 2001-2024 Powered by cncml! X3.2. Theme By cncml!