cncml手绘网

标题: C语言 socket 编写简单服务端客户端通信问题 [打印本页]

作者: admin    时间: 2020-5-9 02:32
标题: C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。3 e' R9 r4 C$ `
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
' m: w. O' [* x* }- I7 k5 bTalk is cheak , show me the code.5 y% p* c1 X/ M9 W
服务端代码:. \9 `# F8 l8 ]; Z6 Q+ C& M6 H
  1. #include<stdlib.h>
    4 W% u2 m" j" P9 L
  2. #include<WinSock2.h>1 x+ V9 b( A: x9 n! r, F4 E! _
  3. #pragma comment(lib,"ws2_32.lib")
    2 @+ O4 [/ p; d% s6 A
  4. int main(){5 e! C+ L3 i- c' r. h: E; O
  5.     WSADATA wsd;) Q( G: o# f# x4 O
  6.     SOCKET sockServer;
    ) k! A9 i, R# f6 p' o& u# ?1 Q2 n
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    : I+ Z3 k* ^) ^. w
  8.     SOCKET sockClient;0 r- {4 @1 F% l2 T1 C
  9.     SOCKADDR_IN clientaddr;
    " p! h4 t+ Q9 E1 e3 S& P5 e/ u; I
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    6 ^" L. z: ~" v0 g' b) [! q% |
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket" l% C; i9 W; B2 s( r  T
  12. 1 q% F. ^. G; H1 N
  13. 5 g) a1 ]6 {+ }* O( \3 }) ?
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    $ p& g7 s/ f9 _7 h( F& i
  15.         printf("Socket has been created :%d", sockServer);4 u( `6 i; |0 Z+ l; i) M! Z/ o2 O' t
  16.     }
    2 m$ a5 o: w* \* C: C; j0 N
  17.     else{8 \, v* ^6 J# f; b1 ^+ @1 V% E; Y
  18.         printf("Socket create failed.");* W* n/ Z5 a: o( X% E
  19.         exit(0);
      ~: w( a. @5 Y" J  e
  20.     }
    8 M6 w. K+ l$ L$ ]
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);7 C  y1 c/ ~1 U. {; `" r6 W
  22.     serveraddr.sin_family = AF_INET;
    1 F+ R9 _4 R/ Z+ [4 R8 V5 x3 l
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    3 E4 B% P2 E& ]. C% w
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));4 P# j6 x- k1 [6 S' }. u
  25.     char recvBuf[100];
    - Y1 U' o% d0 d4 u$ p1 B0 A8 z9 Q: h0 q
  26.     int len = sizeof(SOCKADDR);  ?( S  ^7 L7 K4 O6 [+ F; e
  27.     listen(sockServer, 5);//5为等待连接数
    2 d9 n, u5 x" W
  28.     while (1){9 c' E9 T4 G# Z6 s6 S
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);6 [$ B& ^$ ^2 G! ~
  30.         //接收客户端数据
    9 `/ K6 P9 L/ N8 K
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);& v+ J' V/ @; ?7 t
  32.         printf("to me:%s\n",recvBuf);- z- ~9 ?8 Y$ a" c: @
  33.         memset(recvBuf, 0, 100);
    1 B: I' B. r4 i9 A7 N. X, }4 d7 J
  34.     }# G% b& P+ w* S
  35.     closesocket(sockClient);
      x) ]$ x+ Q9 n* d( i  ~7 y0 r
  36.     system("pause");; O  f8 ^4 G0 c# P' c: |2 Q$ Q
  37.     return 0;
    ; [) }' W+ J# k/ z0 a) E
  38. }
复制代码
客户端代码:/ v" J* {4 J2 l2 W
  1. #include<winsock2.h>
    % Y" x  w# m7 ?& r5 _5 `8 |. w0 m
  2. #include<stdio.h>
    - v6 F8 F0 U' ?, C( @4 v) G& h
  3. #pragma comment(lib, "ws2_32.lib")
    , m9 l- F3 s3 z7 M% f
  4. void main()5 R5 N" V9 w8 |' Z+ A  S
  5. {3 _) o  m  I' v7 A2 _4 P
  6.     WSADATA wsaData;
    ! O  M. H  l; [! o5 ^+ k* O+ y
  7.     SOCKET sockClient;//客户端Socket
    ! A. W# s+ _+ z
  8.     SOCKADDR_IN addrServer;//服务端地址
    + \3 A/ N1 D0 G! P
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    % H0 O# c% m3 i. |  Z5 N
  10.     char message[20] = "HelloSocket!";' M" z# {! p$ ?. D- ?# }, v
  11.     //定义要连接的服务端地址. S% m6 }+ k* \0 O( f" q2 t  z+ h$ n  @! e
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    1 T8 k! y7 n0 x: r; e9 ^+ q8 m
  13.     addrServer.sin_family = AF_INET;  c* `) B: s; i) S; d
  14.     addrServer.sin_port = htons(6000);//连接端口6000& y) J8 F6 y3 `, S
  15.     //新建客户端socket
    5 _4 ~& n2 M/ n, J3 r3 V0 l) _
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    3 t, {1 z6 j+ x  `/ c8 F# j7 ]. i- h
  17.     int s = 0;
    , H5 l' ?/ O. \* L0 {2 f# V2 _
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    2 S9 j2 X- S" S! ]5 z, ^
  19. / I# N) U* r( W* T; v: c
  20.     while (1){
    : n+ n7 D, V3 I6 _/ E
  21.         //发送数据
    8 J' O, f5 M, v
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    " ~' N1 m* }# E9 d4 v  O. M
  23.         printf("to server:");0 k; ?" N( l) }& c0 _, T+ g3 }- E
  24.         scanf("%s", message);9 P3 n( x9 R& V2 O  }+ r2 C

  25. ' C+ z9 y: b' }) P4 b% ^& `
  26.     }
    : B/ y( f9 U1 X! h# T6 U
  27.     //关闭socket1 d$ X# ]5 c2 G( n0 g4 W
  28.     closesocket(sockClient);
    2 h+ c6 i' M  h" u: Z0 w$ C
  29.     WSACleanup();
    : V8 P1 c; \6 P9 ]; C
  30. }
复制代码
求懂的高手来解答一下。
+ i2 U1 I1 \# k! c, c3 z谢谢了!. H3 ^  `' t: t; F+ K

5 `. ?" j* I( E1 c( A
3 L6 n" }8 G: D, d1 L$ \% l- H/ T8 O8 t; j+ |

作者: admin    时间: 2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者: admin    时间: 2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为# G" x, M& \5 t
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了




欢迎光临 cncml手绘网 (http://www.cncml.com/) Powered by Discuz! X3.2