cncml手绘网

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

作者: admin    时间: 2020-5-9 02:32
标题: C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。3 ]4 R# T1 [+ Q. @
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。! }, D/ ?  ]% `; E( T6 P
Talk is cheak , show me the code.' m' b3 w) c" G$ {0 p& Q' O6 H7 {
服务端代码:( M7 d+ M7 v. Z$ }; @
  1. #include<stdlib.h>, {( A: I  x5 n
  2. #include<WinSock2.h>
    ) w( }% t. f2 J  n' D5 y, K4 j" ?
  3. #pragma comment(lib,"ws2_32.lib")6 _5 T8 @) L8 ?3 _
  4. int main(){6 x& j) _7 K9 c4 B- w( v/ s# `# g% b
  5.     WSADATA wsd;
    + V; C% X% n( Y* A! a7 k
  6.     SOCKET sockServer;
    4 D) N( P+ q# e. r* }
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    / u) D9 _2 }4 k! [9 \/ X3 ~5 h
  8.     SOCKET sockClient;
    2 @0 m8 g4 y. K* c2 V4 R
  9.     SOCKADDR_IN clientaddr;: E1 R- V/ s' v" C/ ?( E
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口  K  D2 g. X8 r5 O! o6 X
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    * e6 D' Z+ t, i  M9 @' W

  12. : r! s2 U1 E# N
  13. ( ^6 V, R, A9 F4 G# l
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    ; e7 f" `1 L0 j9 b' s, d0 {
  15.         printf("Socket has been created :%d", sockServer);( Q! \  k  ]: O% `
  16.     }
    ( c8 D4 V6 t3 @& A' e3 h9 [7 Y
  17.     else{
    " L  e) t, o% n5 `; C
  18.         printf("Socket create failed.");
    7 u0 P, H- N4 H' G1 t
  19.         exit(0);
    7 \' |, A) e0 m' J( w( [
  20.     }8 K6 a, F7 L3 H$ z) O  t
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    , @2 W' n; O9 \$ X( {9 r6 |. I
  22.     serveraddr.sin_family = AF_INET;' A3 X0 N' z5 j) Z8 T
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    - X, Q& t# X( H- |- h
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    3 N1 W6 g: ~' {( ]9 \, w" x* ^/ j& x
  25.     char recvBuf[100];
    0 V% i8 ?* A" K9 u# Z7 ^; z, }
  26.     int len = sizeof(SOCKADDR);/ w% J+ G4 \, Z5 ]: J1 j
  27.     listen(sockServer, 5);//5为等待连接数
    ! c0 D0 C, h! D: R3 q- E5 _, c( ^
  28.     while (1){
    * N' \/ x9 @2 ?' w/ e. y
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);4 Q+ ~- `4 g4 `$ h4 x
  30.         //接收客户端数据
    4 Z* d0 i6 F) T. K
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);! h) w7 e+ m$ Z
  32.         printf("to me:%s\n",recvBuf);  W2 L, Q4 o7 H# E: d; o
  33.         memset(recvBuf, 0, 100);
    5 W% M& \/ p  ~. x' b; i
  34.     }, ?  }! Q4 m$ z
  35.     closesocket(sockClient);7 o: f7 y* y0 b: B
  36.     system("pause");; C# G6 z; X9 I" Q6 ]3 B
  37.     return 0;
    8 ~; ^% U/ \5 l  A7 E
  38. }
复制代码
客户端代码:
$ t0 t1 q; c% e4 l+ s
  1. #include<winsock2.h>0 e% |  K# ]3 m5 w! P4 `) P
  2. #include<stdio.h>9 D$ i9 V' q' k3 F- L  |
  3. #pragma comment(lib, "ws2_32.lib")
    9 F( c: L/ c  |. z8 K0 z# y0 B# Z+ q  z
  4. void main()& |1 y4 x8 B2 ^: ]4 I' [+ J
  5. {
    * {4 \& O; O6 o. d! Z% R
  6.     WSADATA wsaData;- H+ n0 F) @: }% g; F6 n2 T2 F
  7.     SOCKET sockClient;//客户端Socket
    3 p. G$ B6 ~! d
  8.     SOCKADDR_IN addrServer;//服务端地址8 ~; g/ q: w$ q; O+ ^% c
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);1 n) M' C8 E  x6 r9 P' ?# [
  10.     char message[20] = "HelloSocket!";
    % O6 }$ a; s# z
  11.     //定义要连接的服务端地址
    # a! m* S- }2 a
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)( C  m, r3 N" H* _  L+ |2 K  y
  13.     addrServer.sin_family = AF_INET;
    , S/ l$ A7 I3 X/ h
  14.     addrServer.sin_port = htons(6000);//连接端口60007 D7 s( \9 k. H' F
  15.     //新建客户端socket
      c/ Y$ m: z' f
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);. ^" @3 b8 |+ J+ W
  17.     int s = 0;+ E. |" u# q2 Y/ v+ e
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    4 \6 o/ T$ t" |/ o% {& M

  19. 7 Y* ^; S8 ?. m
  20.     while (1){
    % @! u. N/ C4 k
  21.         //发送数据4 ?2 B1 o2 D8 y7 L6 W& e0 j% e
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);! }. S" [) r" x' v2 q$ T
  23.         printf("to server:");' T% p1 Z' h( `) L
  24.         scanf("%s", message);* D- w" [; m3 F. {, Q5 c8 t

  25. ) ~9 j' t3 t, N0 H! l  ]
  26.     }  {, C* j5 u- t
  27.     //关闭socket+ ^" c) q7 p* ~0 A  K  \2 ]- v
  28.     closesocket(sockClient);) v" z0 `4 \8 R7 [) j$ G" C6 e
  29.     WSACleanup();
    & L1 Y. \  }; @8 e$ Q, Y9 ^
  30. }
复制代码
求懂的高手来解答一下。# D% f& j( i0 }+ X
谢谢了!8 S5 p9 B) T7 q2 I' C/ e0 b
4 U4 K7 E& n2 P8 c0 _! o, I

' n6 o, I  T" s. J; b, r+ |" q
% V# l) b' n" Z
作者: admin    时间: 2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者: admin    时间: 2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
% L. g! E/ x+ G; n3 V# srecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了




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