cncml手绘网

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

作者: admin    时间: 2020-5-9 02:32
标题: C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。
; i2 u. r1 t- S我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。% J; e, N$ A5 _* \# l5 j) U& f
Talk is cheak , show me the code.
$ d! i* X  {+ a3 z2 h* K服务端代码:
7 ^' K, [, @! I  M
  1. #include<stdlib.h>
    8 l' @* V  o3 U" I3 Z
  2. #include<WinSock2.h>
    8 I. k, i. J2 h* c" U$ g6 g
  3. #pragma comment(lib,"ws2_32.lib")
    5 e; Z1 B8 {* H
  4. int main(){$ E0 l/ S* k2 d' Z7 D2 f  y2 `
  5.     WSADATA wsd;! }2 N# {) T  b: @+ O! z) B4 _
  6.     SOCKET sockServer;) G. J/ l  e% R% I0 f6 W
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    3 ]* r8 a" m9 P1 S% o- D4 ~7 ~
  8.     SOCKET sockClient;
    , F6 N  n5 n1 d( ^
  9.     SOCKADDR_IN clientaddr;" l$ ~6 a% r4 D; e* P
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口  `4 M7 c. V2 l
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket' \6 B) {- [* q( N3 O# i& l

  12. ( H( n6 A1 U. G

  13. $ @' C8 u% J4 s, E# u% I( \' L
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    2 b* V7 D7 x0 o3 d8 P# @0 [, N
  15.         printf("Socket has been created :%d", sockServer);1 }- h/ a# C6 f5 g7 ]- i
  16.     }
    ' Z0 k* Z2 o* w4 F3 t" k+ n
  17.     else{
    ( l* i$ f2 p1 _' c, I  A5 h+ t* e* N
  18.         printf("Socket create failed.");$ s1 Y% z5 Y* A( ]; [3 G
  19.         exit(0);
    9 S( x3 D9 H0 x6 J- B; J" ~
  20.     }
    1 Q, C" o$ [' ~8 K
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    & _# ^9 g* v. y4 @" t1 C
  22.     serveraddr.sin_family = AF_INET;
    : x4 F& {5 A8 Q9 X' `- L
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000$ e) W4 \* ^, b/ ~2 g& Q
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));9 O9 m1 d1 L6 N0 v6 O7 n
  25.     char recvBuf[100];3 F6 H7 T. T8 c
  26.     int len = sizeof(SOCKADDR);; a* ~7 F6 y* A+ M: ~/ u9 Z
  27.     listen(sockServer, 5);//5为等待连接数
    # a3 `4 j- X# t  n3 m
  28.     while (1){* d1 Y7 F, _# r8 o
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
      }4 ]9 h1 C8 q$ w/ q6 v8 T
  30.         //接收客户端数据1 H  n; \, }, P" _
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    ) w" U0 U; j9 ]; c( f7 ~
  32.         printf("to me:%s\n",recvBuf);$ |4 t( |: z3 I# p/ N
  33.         memset(recvBuf, 0, 100);
    2 m, ^" `5 d. y! S+ z1 I2 u" @
  34.     }
    4 R4 u6 y; i3 \) e1 z
  35.     closesocket(sockClient);/ h. p6 }. o/ X8 D/ W2 y
  36.     system("pause");) ?# F; [% H: R" M7 p# s
  37.     return 0;) r* E+ |1 Q' P2 q% o
  38. }
复制代码
客户端代码:% E( t1 \$ a9 E! W; i% ^4 M2 @
  1. #include<winsock2.h>! e& b: D* c5 Q' e" \
  2. #include<stdio.h>, {3 t; g$ L- u
  3. #pragma comment(lib, "ws2_32.lib")& G8 ?0 b! x) N/ @% C
  4. void main()8 o6 _2 P0 }( P2 @
  5. {
    + V/ |3 F0 C5 t: A# d
  6.     WSADATA wsaData;+ R* n5 o* h% h" j+ H8 ?
  7.     SOCKET sockClient;//客户端Socket
    . A4 g) o) a  t  _5 ]
  8.     SOCKADDR_IN addrServer;//服务端地址# s, {; s# |. ~* W
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    - X7 l+ D/ `7 j3 T3 s" O1 A( L
  10.     char message[20] = "HelloSocket!";
    : y! v/ N+ \1 X6 z- y* C! n
  11.     //定义要连接的服务端地址
    . z9 u  b. \* z
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)& @  V, i/ v4 \) A8 a4 Y' j  L# K* ]
  13.     addrServer.sin_family = AF_INET;2 q, Y5 S6 z8 }5 o8 y+ w% u* Z
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    : h& f! P3 V! a! ?0 h
  15.     //新建客户端socket' C5 B  R+ H8 J3 E8 A/ _- r
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    3 M* G* W! q3 c2 t
  17.     int s = 0;/ ?8 {9 C6 J, g' C8 i9 n( O
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    " V5 T3 F7 `  {# t' }* Z$ g2 l# F$ o

  19. ; C  f+ A$ _9 D; Q
  20.     while (1){
    ; @4 |5 P+ y/ _  S; |
  21.         //发送数据
    ) O( r  X# e1 e" B2 W
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    6 k% k( S& l% Q# C; W
  23.         printf("to server:");9 A  X# u( U% [' f/ B( k8 K  [! P, i7 U
  24.         scanf("%s", message);8 k/ |* I  R  c* w6 X# c. x* w4 G

  25. / `" i5 X! |7 ~* n: b
  26.     }
    2 C- t5 f% D( b1 f5 o4 }5 m
  27.     //关闭socket+ `( L- _& ^8 H+ ]
  28.     closesocket(sockClient);5 `4 e& T7 R7 m, [" L% H
  29.     WSACleanup();9 K7 _  }6 K0 h' H; ^0 x) x& Y* R
  30. }
复制代码
求懂的高手来解答一下。
" O# S1 ?% Y; B. J* q- N$ i谢谢了!( {4 g& J: N/ J( B) J

4 t% Q, C5 Z# G$ k' o
: o% {4 }$ N- m7 p  K- U3 V! K' I- ^' Z9 k

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




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