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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

发布者: admin | 发布时间: 2020-5-9 02:32| 查看数: 1634| 评论数: 2|帖子模式

大家好,感谢你的回复。8 W6 N; h! O- u" n
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。! _( `  h# w0 u9 }
Talk is cheak , show me the code., A" H. O+ q$ K; z2 }* [
服务端代码:
2 i! C7 C$ g$ U( E1 k" u' b
  1. #include<stdlib.h>
      f7 \3 {  s( l6 v9 p. z
  2. #include<WinSock2.h>
    # D% H. q* A/ M; @8 I3 B
  3. #pragma comment(lib,"ws2_32.lib")1 P$ ]) \6 `) q& E& [2 h
  4. int main(){, p# r4 @9 ^+ y/ t7 b7 @8 N
  5.     WSADATA wsd;- Z0 U' z( p& t4 s# }
  6.     SOCKET sockServer;0 m4 h3 p3 _( r& L) T
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号1 m1 h. v( G6 V; D
  8.     SOCKET sockClient;
    / P6 B8 g0 {' z+ \7 H4 F
  9.     SOCKADDR_IN clientaddr;4 ^' {( I2 C. \- p3 q
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口6 ~. I8 Y6 z( {2 ]3 ~5 P$ T" b
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    ) h* d0 r. A: }, D/ R# h4 |3 k4 T% l$ \
  12. ! H  l5 M2 F# k$ d* O% _

  13. . S  ]+ D8 W. Q2 Y- i( f4 |; A
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){8 e  n, [+ V! P  r( n
  15.         printf("Socket has been created :%d", sockServer);0 C3 K# _% s* j& b  _( H" n" ?6 y
  16.     }  }3 x1 @- V$ e$ {+ n' Q* w
  17.     else{3 @1 O5 J" D% q
  18.         printf("Socket create failed.");
    , p8 i; ~7 r1 y
  19.         exit(0);
    ( ]" v9 b" z3 _; x1 j
  20.     }
    5 _9 M( @  z! G2 I& U/ n
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);' N) A9 B. y6 W0 Y& g7 R& s# G! D
  22.     serveraddr.sin_family = AF_INET;8 W4 {  q; E: g( v" J
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000+ B6 S- \. H9 C6 r% N. r
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    ( v. d0 P0 [' v/ m6 S; ?5 k
  25.     char recvBuf[100];
    & q  k5 K; M0 m) I! J
  26.     int len = sizeof(SOCKADDR);
    ; D1 C+ J4 x* L: x, T$ \
  27.     listen(sockServer, 5);//5为等待连接数1 Q5 R: _" g% M. M
  28.     while (1){
    7 }7 y3 F; y! `
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    . u/ {6 B9 O. X
  30.         //接收客户端数据
    5 c" M* E  |2 I0 F4 g2 j4 x
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);  ~9 r& Y1 c' p. A- e
  32.         printf("to me:%s\n",recvBuf);
      L& l  j* Y3 n# A4 u
  33.         memset(recvBuf, 0, 100);$ P8 ^$ V9 W) Y3 A4 h
  34.     }
    9 {1 t: q* H0 u& b8 G$ B
  35.     closesocket(sockClient);
    : _( s% V$ G$ S+ v& K
  36.     system("pause");; G" _+ L/ N* u# P! Y
  37.     return 0;1 T7 L: l' j: |! d- |
  38. }
复制代码
客户端代码:1 }  W$ _: T& w/ D
  1. #include<winsock2.h>
    2 S1 v  k: G. t
  2. #include<stdio.h>4 e2 Q& m* U. T6 b1 Y$ f( i& d
  3. #pragma comment(lib, "ws2_32.lib")) W0 |( A; `+ H. Q- \- ^1 O  ^9 J
  4. void main()  a3 b+ C! U5 n! H0 u6 e# T
  5. {& o  H) e- {+ g, F6 d" [' k
  6.     WSADATA wsaData;
    $ z. D4 J. X% x' j
  7.     SOCKET sockClient;//客户端Socket
    3 H8 z& {. o8 i) f) T
  8.     SOCKADDR_IN addrServer;//服务端地址7 _3 ]6 Q8 M$ R9 c5 [
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    ! j) s- n. K' m" z! A
  10.     char message[20] = "HelloSocket!";/ o' m* K1 {; g
  11.     //定义要连接的服务端地址9 r* J0 H2 W7 R
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    2 p7 @  `% w- L6 x3 t; B4 S& J
  13.     addrServer.sin_family = AF_INET;
    1 }) N1 W. q: H' a
  14.     addrServer.sin_port = htons(6000);//连接端口6000/ f3 G2 `' c/ D* c2 m' f! B
  15.     //新建客户端socket
    6 W$ p4 t: p& u
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    2 d& c8 i) L+ P( Z% ]
  17.     int s = 0;
    * b2 r2 [: R+ I9 P  l
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    % P2 A7 H* Y$ A& D# J1 k  `/ H
  19. # C6 m9 O, ]6 z
  20.     while (1){
    : F  f& ~; |! u, A7 n  i
  21.         //发送数据
    & x) v& B6 q, y9 I2 L+ M( f
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    2 F4 Z% p; J$ r+ g
  23.         printf("to server:");
    & \. S8 U7 d  ?. Q
  24.         scanf("%s", message);
    0 n6 k8 J! j3 N, b

  25. 0 ]- v7 T8 t( c9 f$ l1 f
  26.     }1 |' x, q# k2 S
  27.     //关闭socket5 l+ d/ |, u/ @* Q- g
  28.     closesocket(sockClient);* J4 m7 B7 {4 ]5 q2 |
  29.     WSACleanup();
    ! L1 G& G" K1 X9 D- Q6 d
  30. }
复制代码
求懂的高手来解答一下。
4 i2 h: o! M+ Q" x# y# h  M谢谢了!8 b8 Y8 w* O% W

) B2 h$ p) r+ O
  l) ?. U6 I* E5 T4 K( n; ]) ]. C$ Y# r1 k! n& [4 h

最新评论

admin 发表于 2020-5-9 02:33:06
应该用多线程或者多进程,,,过两天给你源代码
admin 发表于 2020-5-9 02:33:20
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为  x/ z% s, G6 m7 r' b
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
        在线客服系统
    申请友链|小黑屋|手机版|Archiver| 备案信息代码:冀ICP备18019919号-1

GMT+8, 2020-8-7 02:54 , Processed in 0.142241 second(s), 21 queries .

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