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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。. C$ U7 H4 q* c2 h" {% M+ k) N
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
; V0 h- m) T0 c' w9 h, Q# @Talk is cheak , show me the code.
% ?( }% A% j! ?) e服务端代码:/ ~$ w; T2 d# Z4 C/ J: u
  1. #include<stdlib.h>. W$ B8 o: X+ ~! e9 E  D
  2. #include<WinSock2.h>, w$ d' q1 p  |8 S7 S
  3. #pragma comment(lib,"ws2_32.lib"), O0 S9 v) X+ D0 B; ]
  4. int main(){* E* `& d5 a/ t# ~
  5.     WSADATA wsd;
    : f& s! t" J4 B4 J/ Y, B7 L( h
  6.     SOCKET sockServer;5 U" h/ M/ g+ }
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    - u, ^' t8 r  N  L( b7 T, J
  8.     SOCKET sockClient;
    ) t9 A- U, m7 o$ ]' Y  r8 N5 }
  9.     SOCKADDR_IN clientaddr;
    5 c- @- e, n" T2 Z
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口9 ^7 M3 h" e& R
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    6 h) H4 T$ p5 E2 g8 _% w

  12. . Z& ^' H" u! E) B& |

  13. , N9 \6 R4 C; k0 \* o( h. k
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){! J& Q% I4 i7 y' v& C
  15.         printf("Socket has been created :%d", sockServer);5 x+ t7 e0 n" ~$ }
  16.     }
    6 l6 L2 Y' F8 q. G- E3 I% ?% a
  17.     else{
    5 o  f1 X- C. x, \- h
  18.         printf("Socket create failed.");
    ( c2 l  ]5 z0 g( z7 @) n! b
  19.         exit(0);: k( Z/ X5 X. z& w
  20.     }. d3 P1 x4 O( [1 y- k: u
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);0 @/ I4 |$ h) ^7 \  D1 ^2 u
  22.     serveraddr.sin_family = AF_INET;  X9 S5 t: ]3 ?# n, z& t
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    * }# u& I3 c+ f0 o
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));' Y' f0 H1 r' t; S' U% L" G
  25.     char recvBuf[100];5 j! U3 ~) i3 v4 X" |
  26.     int len = sizeof(SOCKADDR);
    $ d! O) t. i- }7 ?
  27.     listen(sockServer, 5);//5为等待连接数3 f5 Y8 R: \2 ?; V* g, N
  28.     while (1){, @0 w5 g; z3 U; ?
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);" S9 P# T2 l% ]* b: s' q7 g
  30.         //接收客户端数据
    9 P; D# d1 B( P- l( y) F# T
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    - A) X; @0 T% j( g: m" C
  32.         printf("to me:%s\n",recvBuf);! N% E" U& c* r
  33.         memset(recvBuf, 0, 100);
    9 X% |; y# F  u1 ?6 B
  34.     }9 U2 |3 R2 P( @8 T
  35.     closesocket(sockClient);* x* L" N5 @: k/ g7 D& V' p( N
  36.     system("pause");
    5 [8 ?& x& m8 K+ h% W" W
  37.     return 0;) x! c3 n8 E8 C; P* c  k( p% O; d
  38. }
复制代码
客户端代码:1 y+ f' e7 @  n
  1. #include<winsock2.h>
    - v: [4 v. E8 ?+ k
  2. #include<stdio.h>; w* L" G( m( z1 y
  3. #pragma comment(lib, "ws2_32.lib")
    ) a$ o1 [$ f. R
  4. void main()4 h8 T: |/ `" y/ P" `
  5. {
    9 u- P5 T3 j. P* p+ C, q  f
  6.     WSADATA wsaData;
    / e1 ]+ z/ o8 b3 k
  7.     SOCKET sockClient;//客户端Socket
    ) \. X. z2 ?8 o: z* F$ z: w
  8.     SOCKADDR_IN addrServer;//服务端地址( y" [; N9 n1 ]- l
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);) z! |9 R! {9 K& Z4 R# I1 t
  10.     char message[20] = "HelloSocket!";
    + _0 ^: v6 ~8 I$ |2 W3 Q/ W8 N9 ^. D
  11.     //定义要连接的服务端地址
    1 w: K& ^: ]. O* o" A
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    9 B0 ]3 p9 y0 Z/ D
  13.     addrServer.sin_family = AF_INET;
    , K6 U: L! N: K: h% p  S) [
  14.     addrServer.sin_port = htons(6000);//连接端口6000% D5 \8 s6 C: E1 i2 f1 \4 N) o
  15.     //新建客户端socket
    % P$ S: z& B2 G4 y! O* ]
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);+ e, k- t$ d% i. Y; C! C1 V
  17.     int s = 0;
    . H& U/ `$ R8 P; _) ]& p
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));8 k7 I7 O/ H$ N) U( u. @
  19. + n7 h$ J* I4 y' t0 i
  20.     while (1){$ b, n" N3 U' o8 P) T  U" m2 U; V
  21.         //发送数据
    2 \) z/ L( F# f) {. D) j
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    : o4 Y. H) N, F) c7 {8 m
  23.         printf("to server:");  e) h, W: v4 Q0 v0 v+ x
  24.         scanf("%s", message);
    * N2 s6 \8 P  o- C& Y* Y! }; M# o9 ~

  25. + |; ^, p+ h6 ]/ Q% Z
  26.     }
      [- ]" ]$ E5 N. R9 f7 Z
  27.     //关闭socket
    ; ]. ~- Y6 W% a- l6 X% z
  28.     closesocket(sockClient);2 G; ~) ~9 Q* b$ P) c+ n2 H7 @
  29.     WSACleanup();
    9 g; h; [3 ^) g8 N& y
  30. }
复制代码
求懂的高手来解答一下。0 Q/ j7 R) a1 I: _
谢谢了!
' p5 p* p: ^% f9 _' v) o
3 h- [( t5 z5 Z. [8 o; q8 L* Y. o* D
/ n, E, k' q. q2 ~! D' s

' J! Q/ l# E5 U$ }) M  L
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

GMT+8, 2026-6-19 22:31 , Processed in 0.049802 second(s), 19 queries .

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