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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

发布者: admin | 发布时间: 2020-5-9 02:32| 查看数: 15723| 评论数: 2|帖子模式

大家好,感谢你的回复。" F- M2 ?$ A$ ?3 A0 ~, x
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。  S& _. c  |4 a3 p
Talk is cheak , show me the code.- G* H  {6 P3 ^4 P; k
服务端代码:
& M# S, d; Y3 R7 S
  1. #include<stdlib.h>
    ; c  X" k' i' ^3 k( u
  2. #include<WinSock2.h>% V2 H- b+ }8 Y( B6 Q  U
  3. #pragma comment(lib,"ws2_32.lib"). H: M- ~& ]9 b
  4. int main(){
    9 `% x5 O+ i- ]  Z
  5.     WSADATA wsd;
    9 f, |3 ?! q' ?+ @/ h# p
  6.     SOCKET sockServer;
    % V! i/ v0 l2 ]% W
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    9 v. W" q. @5 R& s& {1 `
  8.     SOCKET sockClient;" j" z0 D, n: P8 F
  9.     SOCKADDR_IN clientaddr;
      w% ~* `0 d  z
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    - M( Q4 m6 K& O
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    " H, v2 b& |0 S6 }! m4 H
  12. 8 C' r) A9 p9 h) S

  13. + Q: w% K, W( X
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){6 L0 z6 s+ g" [+ @0 Q  Q
  15.         printf("Socket has been created :%d", sockServer);
    6 @! K) C. `* u& s
  16.     }! ^( l8 C# n1 U( S0 f
  17.     else{
    " o  k+ y) L, A3 Q3 {% c/ {
  18.         printf("Socket create failed.");/ r3 u3 ^/ ]3 d0 u
  19.         exit(0);
      V- B  y: x$ r& I4 X4 a( N
  20.     }
    . g# z8 ^% _. O$ p2 O7 b
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    . u8 ]/ d" G- n9 o# G7 Q
  22.     serveraddr.sin_family = AF_INET;
    * R) b/ A1 i2 R! q/ E" Z3 Q
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    . {( U$ e9 a2 y9 T4 f
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));3 W9 V6 f4 s' u9 Q
  25.     char recvBuf[100];7 Z- U9 E4 H8 R7 h3 H
  26.     int len = sizeof(SOCKADDR);( x' K0 e$ z( {% s( Q9 q
  27.     listen(sockServer, 5);//5为等待连接数, A* I- w. I1 `6 ^+ c
  28.     while (1){, ~- J  M* g6 B7 r% S; O! J3 S( I
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    ; }. H8 K' E' k7 d; s2 U9 E
  30.         //接收客户端数据! y, _. e; k( ?- m2 v. s% E
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);" N4 m! F4 L. v+ @" S
  32.         printf("to me:%s\n",recvBuf);  V' n6 S* i. N. |# x* j+ S
  33.         memset(recvBuf, 0, 100);
    ; e0 d4 R# h7 w
  34.     }* S( c- \3 ^* P# \& R, A1 a1 `
  35.     closesocket(sockClient);6 A3 Y/ R/ e' N: I
  36.     system("pause");/ p1 u6 Z# @1 ~6 a* A5 {5 E$ T. D
  37.     return 0;- B: R) r. {# Z. s
  38. }
复制代码
客户端代码:
% v0 _8 w7 Y3 w/ A; W) W
  1. #include<winsock2.h>4 N& R( u/ k" e' n; \: }% `
  2. #include<stdio.h>/ N/ \; {% c& Y) z; B! I
  3. #pragma comment(lib, "ws2_32.lib")% a: n( h* F5 ]0 i" B5 v
  4. void main(); [4 }1 ]+ x* A) D% g, T
  5. {
      _  O( f$ @  o# M. ^3 W
  6.     WSADATA wsaData;+ P$ I/ y  I9 W
  7.     SOCKET sockClient;//客户端Socket' d. b7 P: [' X; y7 r
  8.     SOCKADDR_IN addrServer;//服务端地址
      y$ q: Q1 w( G: j6 n; H& G
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    % |5 }/ h1 s- u; {1 Y8 i
  10.     char message[20] = "HelloSocket!";$ Y+ _5 W- `; Y: z
  11.     //定义要连接的服务端地址
    ; d% m: K! D  Q5 f# O2 X" w
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    ) m# {' k' x0 S% @* }* D
  13.     addrServer.sin_family = AF_INET;9 v2 x+ v! O8 b6 }# \7 I
  14.     addrServer.sin_port = htons(6000);//连接端口6000  b# Z2 b3 @' s) P
  15.     //新建客户端socket8 M0 E% g! T9 Q& G, ]8 E
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    ( z& [3 ?/ A/ |/ [
  17.     int s = 0;
    7 |2 R' {, K2 @6 [  y2 x/ E
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));% F5 T1 X4 m1 s5 L- [5 f$ [+ g
  19. * v% E7 D1 C+ O! i" V; m, p2 f2 I# Z
  20.     while (1){4 l, r+ j. u8 B, B& X( b% D9 G$ Y
  21.         //发送数据
      T: i- [" y4 L+ f  m. J6 U" F
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    . d* Q+ R- ]$ f/ s# ]+ e1 S
  23.         printf("to server:");+ O0 X1 q7 U' v, l9 l+ x
  24.         scanf("%s", message);
    : Q* ~3 S0 P, s$ T* k- r

  25. 5 d3 k, w% K5 k4 c# p
  26.     }
    $ V- R! `# E& }
  27.     //关闭socket, T7 \3 T! U% }
  28.     closesocket(sockClient);
    , S, ?' L4 e# X3 Q4 S* `; L! f
  29.     WSACleanup();4 e+ G% a; h( I! t
  30. }
复制代码
求懂的高手来解答一下。* n  Z0 D# Q6 J1 q" o
谢谢了!! C  G- M# P5 ?

' ~5 ^" q; l( x. V9 g# z9 v; b4 B1 @6 K: ^" E& W  |# x" \

, c$ x$ _, q# `- V- e

最新评论

admin 发表于 2020-5-9 02:33:06
应该用多线程或者多进程,,,过两天给你源代码
admin 发表于 2020-5-9 02:33:20
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
8 o6 @7 l  z5 m2 Urecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了

GMT+8, 2026-1-30 06:33 , Processed in 0.067353 second(s), 20 queries .

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