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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
* O% u" j1 U5 h! P我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
/ `, p/ }/ j  O" o5 p. D# y! E8 T. kTalk is cheak , show me the code.
9 f9 c$ Z7 I1 @5 F) r4 R; ~  M服务端代码:% \$ ?+ m/ o* Q2 T5 u; {+ Z
  1. #include<stdlib.h>
    5 m! E. j2 v2 {+ n3 r' W2 t
  2. #include<WinSock2.h>
    # L  S$ R2 ~9 ~. t; m# l3 Y& ^
  3. #pragma comment(lib,"ws2_32.lib")
    1 B/ s* z$ A0 Z( r- J% X; z- @
  4. int main(){( _- y8 c, w) H& l
  5.     WSADATA wsd;2 j$ y4 }4 [, a. I4 s0 W6 Q7 A
  6.     SOCKET sockServer;
      ]6 g- r0 q% u: M0 B1 G
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    * j3 T! A( y- E- T
  8.     SOCKET sockClient;% s7 r8 W$ U# y# r, z! `
  9.     SOCKADDR_IN clientaddr;
    ' H" O8 |- A. n1 t, W$ ~
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口* x% O* l1 a% q, w
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    - X7 o$ A# Q( d/ a

  12. " B2 y+ k1 |; ?6 i; Z6 `% x

  13. ; k3 y5 |* I9 A9 ^% l! i
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){0 W: `6 w/ ?6 \: A1 r0 p( f
  15.         printf("Socket has been created :%d", sockServer);
      K1 v+ X6 V7 M9 L! q
  16.     }
    8 Z" u0 O: J0 e  V0 m8 C
  17.     else{
    9 @. W" y& k: x# s4 _1 P6 T
  18.         printf("Socket create failed.");
      L8 O. L, g6 [% o
  19.         exit(0);
    8 \' _( i* z( d/ C9 E4 y
  20.     }' r& v6 A; o9 i" q: Y
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    : f8 h1 b5 h! G
  22.     serveraddr.sin_family = AF_INET;
    % o+ ?$ [2 }6 H+ D
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000# W: @6 g! Q# W' U
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));$ [! A0 s: x, O% E' c
  25.     char recvBuf[100];6 U8 Q9 {, t9 B+ C
  26.     int len = sizeof(SOCKADDR);) [. H0 m  |% U
  27.     listen(sockServer, 5);//5为等待连接数" X: v1 @* B/ Y. J
  28.     while (1){# g( q+ `4 |4 q0 A8 E4 B
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);: p  ?/ t# ]  t, d. N; B1 E
  30.         //接收客户端数据
    7 `, B- v' A+ x# @. o0 z
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);5 U3 [+ q" ?! K; z5 \
  32.         printf("to me:%s\n",recvBuf);$ A) h/ i" g1 S
  33.         memset(recvBuf, 0, 100);. e5 S, H. j& ~" k
  34.     }
      m' d. _6 Y. D6 v5 ~' P9 [9 x
  35.     closesocket(sockClient);
    7 y1 x% d" M0 k7 L, h" x7 x
  36.     system("pause");- i6 `# f. v' |
  37.     return 0;  ^1 z8 e4 N2 h5 A2 K$ M. |
  38. }
复制代码
客户端代码:
# z8 M$ E4 T+ L' W+ q$ ]. b4 s! k
  1. #include<winsock2.h>
    2 X9 M. M, W8 H( o2 R
  2. #include<stdio.h>
    ) e5 z/ s" q4 f$ W& V5 Q; L
  3. #pragma comment(lib, "ws2_32.lib")
    % i( K4 }6 ^5 s$ N; ^3 Z
  4. void main()  t$ T5 ^6 D6 {/ r! H8 a+ r
  5. {% b: v$ Q8 v0 j. x3 M
  6.     WSADATA wsaData;
    1 K( S& i) x& x; A& \- ?, o" `
  7.     SOCKET sockClient;//客户端Socket6 {6 d: f; b7 A% ?6 Q4 F
  8.     SOCKADDR_IN addrServer;//服务端地址. G7 C+ q. \! D7 H1 @4 U
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);  n3 B0 G  O8 }+ ^# S7 y" }
  10.     char message[20] = "HelloSocket!";
    " j9 J  E+ t* t1 b9 r
  11.     //定义要连接的服务端地址5 I0 U2 O* p0 u
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)1 u4 a( q, |! p. ]. `
  13.     addrServer.sin_family = AF_INET;
    8 ?9 K9 l% K* @  G0 {% a
  14.     addrServer.sin_port = htons(6000);//连接端口6000. `: z% S: F9 F( f7 {. e
  15.     //新建客户端socket
    2 W: m" b( T- u( _
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);( `: K5 K% L0 B0 }+ ^
  17.     int s = 0;
    0 @0 G4 T5 B, z9 P0 X: p
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));; W0 t$ H- e/ n% Y
  19. : z' `0 `# T4 m1 l
  20.     while (1){
    0 Z; k) ^( `8 A( I6 J
  21.         //发送数据2 l0 }2 n2 d% B/ `5 V( d
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);  ]% e) r; H+ D" E- i6 w
  23.         printf("to server:");" A3 R0 @+ {8 R/ `
  24.         scanf("%s", message);
    & C8 m: j, n6 I  G; ?1 W

  25. + }5 q5 m8 {% X/ P
  26.     }
    2 u1 f( _8 |) o; S+ A% f
  27.     //关闭socket
    ( e/ Q' c( h! q# p# [5 u
  28.     closesocket(sockClient);
    4 g* \2 V' Y# X! s6 O0 B$ V
  29.     WSACleanup();
    # n# N6 H+ m( _5 W% ?5 U
  30. }
复制代码
求懂的高手来解答一下。7 g- H2 l* k% d2 K) Y9 {0 P
谢谢了!
5 w7 r8 @$ R, f, C/ F5 d
2 C) q7 \0 @" [" O  R

( f0 Z. ]6 a  l7 I' x
; P6 s6 ]+ ^0 d# l" y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

GMT+8, 2026-9-21 02:05 , Processed in 0.051331 second(s), 18 queries .

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