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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。( m+ j+ d0 |& a) D( R. t  ^& [
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。- P9 U. Q: ]0 G: S2 b
Talk is cheak , show me the code.
( B3 ^! D' x- N  \9 f服务端代码:1 |2 V6 s% S2 K- J9 `
  1. #include<stdlib.h>/ C2 ~% I2 d- C% K
  2. #include<WinSock2.h>) S% _: x, c# A* H
  3. #pragma comment(lib,"ws2_32.lib")6 ]0 Y$ n0 Z+ ^& w; G: k/ j& a# O9 h
  4. int main(){& j0 _. ?$ t& Q
  5.     WSADATA wsd;/ N$ e. H& p- t0 u, H/ z9 h
  6.     SOCKET sockServer;
    0 ~6 K7 T& ^: V4 c( Q+ g. v5 x" `+ u- ]
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    $ |  _( J- h: Z. g2 L5 ?
  8.     SOCKET sockClient;
    8 r2 x$ r, d* j8 z  j
  9.     SOCKADDR_IN clientaddr;
    $ L4 W: H! t8 r
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口# p0 h( [3 c2 c7 [9 A
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket: K! w& M4 R9 F0 j* y0 p6 {+ L
  12. 9 }' l6 |3 ]. h. k9 i
  13. " `5 d9 w) f7 A9 U" [0 j
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    ' t) T0 m$ v1 z2 Q
  15.         printf("Socket has been created :%d", sockServer);
      O* r" H0 b3 T) n/ P
  16.     }
    5 [" b1 t) F. M( w! a- g! F
  17.     else{1 w' f5 p) F" H8 P+ K
  18.         printf("Socket create failed.");! Z, b. L5 V( S5 I" z
  19.         exit(0);' w" r- V/ {6 Q! x, G
  20.     }% S8 G6 M( |! v$ C" p
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    $ g- e5 q7 \8 g2 A1 F
  22.     serveraddr.sin_family = AF_INET;
    6 R" m6 @2 {2 P. [, u- a
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    0 r, e1 z  Q1 r; g% i) A+ L
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));7 Z% ^6 R4 E* V
  25.     char recvBuf[100];) p; A0 l- f/ Y( t5 K5 ]+ {3 c
  26.     int len = sizeof(SOCKADDR);
    , b0 ]8 i5 ^" ?8 j2 S
  27.     listen(sockServer, 5);//5为等待连接数5 b! ~+ H: z7 X* V2 X" I
  28.     while (1){4 ?4 G( y* m, ~% I* w  @
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);6 j* D! p! p4 ?* W
  30.         //接收客户端数据. P$ m/ h! y3 l6 D8 V+ g+ |7 H
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);+ S  W, G# R- P
  32.         printf("to me:%s\n",recvBuf);
    2 S+ M% K1 ~# x/ `; H  h9 ?
  33.         memset(recvBuf, 0, 100);+ c! Q  R) Z, u/ X; G$ w
  34.     }4 L; M5 ^/ ^! f: i! `* l
  35.     closesocket(sockClient);
    3 E/ u; \! W" ^& g0 p; x
  36.     system("pause");
    : ]; z. \! _! ~5 }
  37.     return 0;
    2 g+ n5 a1 J5 j8 w+ f. j' S
  38. }
复制代码
客户端代码:
; z7 r* I9 C# C8 I5 [
  1. #include<winsock2.h>
    5 |4 ^1 \. x7 |  x" @! e' @
  2. #include<stdio.h>
    9 V1 X/ g2 r0 B
  3. #pragma comment(lib, "ws2_32.lib")
    - n  k6 |: H7 U. B3 Z$ ^
  4. void main()
    . X1 u0 E7 Q3 Q1 u
  5. {- D7 P9 `( h% C( B! ^. P. l
  6.     WSADATA wsaData;
    $ @: g4 Z+ I9 Z' {# ~% n) v6 E" l8 W
  7.     SOCKET sockClient;//客户端Socket5 w9 l8 S0 p0 _+ P
  8.     SOCKADDR_IN addrServer;//服务端地址
    / O. i( P( E5 X; I  f0 A
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);8 N. T7 A% \. z' _0 z5 H. `7 k- }
  10.     char message[20] = "HelloSocket!";& X6 \( M0 U7 @# _2 M7 M! s# z9 A: _( T
  11.     //定义要连接的服务端地址
    $ |' G2 Y1 E5 y" i* i0 A4 U, j
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    ( i6 a) ^+ d+ B
  13.     addrServer.sin_family = AF_INET;
    " f0 [  ~- d3 l2 ^
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    . \9 n. N3 ~6 B# w  J+ [- G4 g! x
  15.     //新建客户端socket
    - s/ Z0 `, O4 |! G1 Y' h7 e
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);+ M0 [+ I5 S$ ?) R  m
  17.     int s = 0;8 M% j2 v! W$ Q- \+ m% g" D9 K! S
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    " r4 a, L$ u4 ]& N; {# L: i  T
  19. ! ?$ j% m/ J' d5 k( T
  20.     while (1){4 A. L+ F- \. ]6 R
  21.         //发送数据
    - f: o/ a7 v& F0 t, r
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);8 s: w+ K, A7 |
  23.         printf("to server:");0 y9 i. Q- j2 ?8 \( Z
  24.         scanf("%s", message);5 v5 M) K$ p* t; n, s/ O
  25. " T, h$ D$ Z% X  I
  26.     }" z! E- _" m: W. L
  27.     //关闭socket( e/ N$ i: X/ ?, g0 L* T
  28.     closesocket(sockClient);
    2 k1 x- r5 G/ ?
  29.     WSACleanup();
    4 g- g& g+ c4 ^
  30. }
复制代码
求懂的高手来解答一下。
% B% k# \8 @/ F% }+ C# ^9 c谢谢了!
' O5 j% W" q: @
9 J# H2 J) ^+ r/ ~/ A! @
7 k1 M: w9 l7 q" Q' i

7 Q4 j; N  f; }6 H% [) d! 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); 这句改为
' V0 z2 a6 ^& ^# G5 p9 trecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-3-16 18:41 , Processed in 0.055356 second(s), 18 queries .

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