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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
大家好,感谢你的回复。
3 p+ n2 j  z: q7 F" r5 q我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。/ c) Y: R# s) w' r: u2 p, C( E
Talk is cheak , show me the code.( n' x5 A; m2 Q) m& k
服务端代码:$ |! j5 o& H3 P
  1. #include<stdlib.h>0 u0 B" P: a" e0 @
  2. #include<WinSock2.h>
    9 d) ~# ]5 B2 e% E* H' K
  3. #pragma comment(lib,"ws2_32.lib")
    ( L# Z( Y: z1 t  t% n3 }5 j& q
  4. int main(){
    ' S2 H, D$ h+ n
  5.     WSADATA wsd;* f4 }+ R1 `+ F6 ~' F( y8 D# N7 \
  6.     SOCKET sockServer;
    4 D% ?' w2 p2 D3 }
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    $ k* l- M! ]& y0 Z1 y9 P
  8.     SOCKET sockClient;% {4 @( u% h1 [$ ]  }
  9.     SOCKADDR_IN clientaddr;; p9 x5 T* K$ L3 a( u
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    9 u0 h6 _4 \+ }$ l1 Y5 K) o$ z
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket  _4 p/ K# A1 r, R6 h7 Q
  12. # {% u! d' o4 y3 s& w
  13. * K8 z9 M+ d# D6 @: p  K
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    ( {3 [& ?/ w/ O( k7 F
  15.         printf("Socket has been created :%d", sockServer);, ]" k  W. N+ ~7 O- I) N0 H2 P
  16.     }1 Q9 L* ~) W2 Q2 A
  17.     else{: T9 {  j9 z( G1 q- v
  18.         printf("Socket create failed.");. _- m- @+ ~: t. i, C& z( S
  19.         exit(0);
    " F. h9 Q/ F' z+ e6 G0 F
  20.     }' n; d2 a: @; r, Y+ Y  c
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    , @* J+ n/ l2 G5 I: A
  22.     serveraddr.sin_family = AF_INET;! z$ w6 n! \( {5 g+ e
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000' M& m- Z; {, [: h# n, \
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    3 ~$ H' n* ?  i' N
  25.     char recvBuf[100];* @% u; m: N7 e* q+ r' C( I
  26.     int len = sizeof(SOCKADDR);4 W, A3 b- ?. U+ A5 \
  27.     listen(sockServer, 5);//5为等待连接数$ S0 `  N; P' v4 Z- ]
  28.     while (1){8 @" a6 m& T% r4 |
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);- a3 v' E6 H" W: L. W, I' d( R
  30.         //接收客户端数据/ N& k. J; U0 l2 n9 f
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    : j) B( _6 F: F* o5 @) x
  32.         printf("to me:%s\n",recvBuf);
    * L2 s- I, ?" F7 w: g) y$ t
  33.         memset(recvBuf, 0, 100);
    ' s& z5 b* _* P* R- Q
  34.     }: p) p6 _4 J  Y
  35.     closesocket(sockClient);
    " h) y+ w" r, X9 T8 L- s* v
  36.     system("pause");" C1 c6 h4 b0 ?8 @5 L$ b
  37.     return 0;
    * b& s3 F1 H& B. \
  38. }
复制代码
客户端代码:
$ c6 h4 d' b9 M' F0 G) `
  1. #include<winsock2.h>1 P1 {4 s# A' k
  2. #include<stdio.h>
    % {& l+ J* }2 `5 N
  3. #pragma comment(lib, "ws2_32.lib")  l! S* r) _$ p; m- w. S' n
  4. void main()% b3 _. E/ F1 d! _0 l; C. j
  5. {
    5 }: `/ g" Z& w) y" L7 L
  6.     WSADATA wsaData;
    + n7 p9 @4 t  u' [
  7.     SOCKET sockClient;//客户端Socket1 o: Y0 u2 w6 v; f* [3 d( U0 P  d
  8.     SOCKADDR_IN addrServer;//服务端地址/ w9 u  M' D( G0 n3 [$ s
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    ( w) G- G# K/ D' R
  10.     char message[20] = "HelloSocket!";
    - @6 i8 P1 a/ p3 u. S
  11.     //定义要连接的服务端地址- L2 @3 m1 X6 h, c, Q
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)6 }& g/ r% N- F" l4 B
  13.     addrServer.sin_family = AF_INET;
    2 p: _+ g, c3 R) b( L9 o
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    1 G( P# m" W; n: n4 K
  15.     //新建客户端socket
    - c* N/ w8 ^2 ~7 ?5 A/ b
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);2 d: X$ o5 a! i# x. |1 L
  17.     int s = 0;
    - f; K$ p% D4 Q+ L
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));4 {' H6 g: \" R/ r- ^9 y

  19. . d* a9 I; D7 V2 r
  20.     while (1){
    5 Q: r. u$ L/ `0 [2 [! y
  21.         //发送数据. p) {: ]. k5 J- P+ `/ N
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    % I$ V, r6 Z: a
  23.         printf("to server:");2 P6 S8 [! }- B1 G* c  x, B; F4 S
  24.         scanf("%s", message);7 E1 S7 B8 @0 n5 P$ I
  25. 7 v; p# x; n7 `
  26.     }
    ! ~- r# C5 y( n; [% q0 Z6 L/ p
  27.     //关闭socket. C5 l0 ~3 T7 @3 K% z$ F
  28.     closesocket(sockClient);
    ) w2 ]6 x, e/ ]$ r( J
  29.     WSACleanup();
    " }& W, C& a4 u3 t: s7 C/ e2 @
  30. }
复制代码
求懂的高手来解答一下。
% M5 ^6 V$ J: u' ?, @' L9 J谢谢了!: E3 h- Q4 `$ G' T7 J; i

" Y0 R# @  n7 k) h& a( m0 _1 z9 k: @* x& }/ C3 z1 w
4 p1 M7 }( F* k( e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为+ n. W( A: H) V
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2024-5-4 19:16 , Processed in 0.109181 second(s), 19 queries .

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