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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
. R. g9 H7 |# m7 j0 b5 u7 s) d我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。1 Y) q! l& T9 {/ B& [+ Q' u
Talk is cheak , show me the code.
9 a+ e% ~0 S' ~/ n$ _! c服务端代码:
, c1 S! d! L( X9 @
  1. #include<stdlib.h>
    , ]1 T7 C" f! n1 ]: N( Y3 L
  2. #include<WinSock2.h>) k1 t  }  M9 ~7 [; i7 ~
  3. #pragma comment(lib,"ws2_32.lib")( t5 [: c$ d6 a5 P$ K4 j
  4. int main(){
    . ~# g6 O; w+ V% ^, X
  5.     WSADATA wsd;
    8 ?! f5 C* M  {" B. m  ?! q5 E
  6.     SOCKET sockServer;
    % t9 k$ ~9 T# l1 @- d% D/ J: o2 p6 H
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号) Z0 u- w! K5 R. K8 l- f
  8.     SOCKET sockClient;
    8 w0 ^2 g; l; w: `3 O; [' Z, D7 k
  9.     SOCKADDR_IN clientaddr;% w8 h4 f7 k1 L5 J
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口) e- K- g7 u9 n' E, e8 V% s6 }* i
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket7 v- p. I2 b5 }

  12. % u1 J7 S$ O6 V( _. q+ R1 f

  13. 9 O; `) X; e$ c5 D
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    0 w  w7 S8 P6 B% \/ l3 l1 V. O
  15.         printf("Socket has been created :%d", sockServer);
      C5 R4 v/ H8 }9 D/ d& K
  16.     }" h1 t6 ?& U) G9 P, I
  17.     else{
    9 I9 \- x1 z% D: V. d8 m* z" a  X
  18.         printf("Socket create failed.");
    " M8 ]6 O3 Q' n( x
  19.         exit(0);
      R6 H6 P- u8 P/ b8 x/ n! b( X% J
  20.     }$ D: C  V  U" c4 e' k
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    9 W- F) ^! `0 x; u7 C
  22.     serveraddr.sin_family = AF_INET;  j7 P) a* k  O! i9 ~+ w, v
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    ' H: u& g- j4 H7 B: d
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    ) k; j. o8 F9 v" K1 d, B% B$ \: M0 E+ u
  25.     char recvBuf[100];
    $ [1 U6 l& X3 T( ^
  26.     int len = sizeof(SOCKADDR);
    / A, M- g/ s0 [5 n
  27.     listen(sockServer, 5);//5为等待连接数7 _4 U( y% `8 c/ A
  28.     while (1){
    ; k  N' Y$ ^1 K2 @) L, G+ H$ i
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    6 O( Y- t. H5 F7 Y* k
  30.         //接收客户端数据8 o, z  F5 K; ]+ U. R/ ?
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    9 F) g2 l7 ?  c0 |6 Z3 ]. q
  32.         printf("to me:%s\n",recvBuf);" X, h4 @4 F0 u) s$ N! }/ K3 P2 O2 x1 \2 x
  33.         memset(recvBuf, 0, 100);/ t+ W" m$ }1 `7 {
  34.     }$ G7 n+ f+ D$ S! J
  35.     closesocket(sockClient);  \/ H2 S7 q0 V  M- O& n, p
  36.     system("pause");
    $ y; \+ g, ?, s3 O  G$ G5 G: O* c) O
  37.     return 0;1 C* ]) |: a3 x9 r( w# H, |
  38. }
复制代码
客户端代码:
/ R) g3 c7 I8 P( w
  1. #include<winsock2.h>
    3 a+ `. R; q5 w, v' _
  2. #include<stdio.h>/ C6 s3 S# L( U2 e6 |
  3. #pragma comment(lib, "ws2_32.lib")) h7 a9 p# s# ^7 \* L! e! d
  4. void main(). J( {) d- M- c3 H$ w+ w4 q9 F" S
  5. {
    3 e4 Z0 N+ o$ j: B, t4 R
  6.     WSADATA wsaData;
    " ?3 `' x, d) {! A
  7.     SOCKET sockClient;//客户端Socket/ S- U. _0 J& S# x9 a, C, k, F
  8.     SOCKADDR_IN addrServer;//服务端地址
    / k% G$ W5 M# L8 z8 ]
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    4 u6 \  O& n/ \7 [
  10.     char message[20] = "HelloSocket!";9 H1 w* S! a7 ~( K; |  V
  11.     //定义要连接的服务端地址6 i; f  _. t1 ^9 A5 n' r4 S
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)  V, q1 i- s% N* Y5 E* Y
  13.     addrServer.sin_family = AF_INET;
    7 K; Q/ p! C$ |6 u+ W+ R
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    6 `# v; J/ i) J# y9 G0 k
  15.     //新建客户端socket' n3 G: L6 Z/ r1 W2 k
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    - W. ~0 V& s/ N* ]3 P8 l$ t6 E
  17.     int s = 0;
    / F5 h' s2 [* K5 X
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));9 ?7 ]- s; q" }: `5 B5 @! `* D2 B
  19. 1 l. S, `* n7 D# q( E
  20.     while (1){' R8 c4 s. V( S  y, }8 S/ C' T
  21.         //发送数据  F% T( o% U1 U3 E' p' ?, p
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    , ^: v! J" N' @6 X
  23.         printf("to server:");
    ( H0 n' Q% w/ Q8 Q# p
  24.         scanf("%s", message);0 q8 M2 t1 f) u' I" H2 `8 ~7 W( ?

  25. " y/ z+ a; y! o6 m; y
  26.     }
    + B- [2 h6 Z8 X8 l% i
  27.     //关闭socket' h/ K' ?4 S8 P1 ], m$ D5 o
  28.     closesocket(sockClient);
    * L( r' y: }5 ]3 m  T8 H' O" m
  29.     WSACleanup();0 }3 a& T. F) m; {8 W  K& x6 e8 q" `0 @
  30. }
复制代码
求懂的高手来解答一下。
0 P) X- k. F/ t+ C谢谢了!
0 T: V" [0 B: k5 V. `; Y

7 f/ D& Z; S: n7 j
1 g8 L$ Y* v+ h
) x, x7 \: m# V1 o1 t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
8 b0 K+ ^+ s9 ^recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2024-5-17 15:43 , Processed in 0.117359 second(s), 18 queries .

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