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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

大家好,感谢你的回复。
9 E" g8 h8 @% `* S) S: S我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。+ _  q0 D) e& V3 y4 b1 A
Talk is cheak , show me the code.& A% X# L0 }" T
服务端代码:
. T/ y/ U  }0 ]8 H* t  Z: _
  1. #include<stdlib.h>
    9 A/ ?) e2 O* l# Y% f# }% h8 Q
  2. #include<WinSock2.h>
    + ?- \/ P  _, c
  3. #pragma comment(lib,"ws2_32.lib")* i8 A; Y0 N5 G. Q" t! \
  4. int main(){+ F% Z9 |) K6 _8 g; M) e, o
  5.     WSADATA wsd;; o) c  J: N. a* i6 T
  6.     SOCKET sockServer;
    2 U; A2 R4 Q; r
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号8 E. ~. j+ y1 ~9 l0 e% s9 W
  8.     SOCKET sockClient;. D1 b7 E& K: W; A$ u# v; p
  9.     SOCKADDR_IN clientaddr;
    1 q; @+ N7 e3 Z3 G
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口3 m9 {$ S" Z0 p7 T
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket. ~1 q2 c+ E* L7 T& u+ k- o( j
  12. ' L2 D, X' L$ k0 x

  13. 1 x! k5 b6 D( _
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){1 U7 ^' E) o+ ?9 [2 _% D
  15.         printf("Socket has been created :%d", sockServer);
    8 f& G- M$ ^: K) S! p- J- p. V
  16.     }
    1 f& E5 q: j: _# K
  17.     else{+ g5 d9 [# o. {/ w& u2 \: P
  18.         printf("Socket create failed.");
    * \8 J1 q  P8 s1 ]/ k  O( f) r
  19.         exit(0);
    1 Y) [9 t& Y1 M8 r( B  \" A
  20.     }2 Y" R; w( n. t5 m$ g
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);9 G  ]$ j/ b' m* M# t
  22.     serveraddr.sin_family = AF_INET;% j$ [9 j6 r8 i! B! D  @& e6 k
  23.     serveraddr.sin_port = htons(6000);//绑定端口60007 l' ~0 m1 b! F6 t$ r- F  }1 v: n, E& i
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));) u; G! P8 K" O6 N' D  I
  25.     char recvBuf[100];; |4 s; `7 Z+ Y! E$ Z5 [( V
  26.     int len = sizeof(SOCKADDR);
    + H6 P3 \6 p2 H! C# _- @4 K8 z0 _
  27.     listen(sockServer, 5);//5为等待连接数" [0 H% z0 r8 q0 w
  28.     while (1){
    3 b1 k. q9 N# U2 X
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);# i1 d: T  b5 b& j
  30.         //接收客户端数据& F. b1 j5 x; Q% B# z: R
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    ( s4 ~6 O3 g! p/ O
  32.         printf("to me:%s\n",recvBuf);2 ]8 A5 _5 w. G: r" ?; |
  33.         memset(recvBuf, 0, 100);* U3 d) x4 s: g9 S  G6 e
  34.     }  Y5 |  e2 `' F4 x9 C) b& F3 O1 f
  35.     closesocket(sockClient);2 A5 N% \6 a5 b# t
  36.     system("pause");% I9 `* a1 G5 H4 Y# K  R/ |8 d) G5 A
  37.     return 0;
    * @& F3 d# e5 `+ k1 C
  38. }
复制代码
客户端代码:
4 b: F$ V" j: z( l6 W& v5 K/ ~8 j
  1. #include<winsock2.h>. C0 E2 J# P1 y3 ~, k& w1 {
  2. #include<stdio.h>0 o# l# c. I4 ~+ k
  3. #pragma comment(lib, "ws2_32.lib")
    % @: |0 f0 L& G0 Q0 g' w  i  @; F! n
  4. void main()
    0 m' R/ E9 B+ h- q( c! ?
  5. {- j: N& g* y4 A4 u+ r6 q
  6.     WSADATA wsaData;
    * H" Y* g! z8 U* Z' u4 B
  7.     SOCKET sockClient;//客户端Socket' I- \  M# o6 J; y
  8.     SOCKADDR_IN addrServer;//服务端地址4 ]! T9 K( Z0 k5 V* V' ~5 m
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);# n6 I8 q4 [5 i3 {
  10.     char message[20] = "HelloSocket!";: u" o# _: A3 G; C/ \  X. X
  11.     //定义要连接的服务端地址
    ' g/ `! w; ^7 E
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    - r. ^+ F; W( ~! F. R4 I
  13.     addrServer.sin_family = AF_INET;8 }9 N9 q# [3 I* ~; K
  14.     addrServer.sin_port = htons(6000);//连接端口6000$ h/ f5 w. Z! c1 N, D
  15.     //新建客户端socket, D" f9 V  g" t/ ]  y$ F
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    ( x5 B0 W; Q5 q
  17.     int s = 0;6 i6 |1 ]" O) M# s( L4 k* G7 X
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));0 T5 y! j9 L2 W
  19. 2 Q, X9 ]2 z! H0 H0 E$ V
  20.     while (1){7 L& N5 r" w" k/ p0 e
  21.         //发送数据
    % V, n0 y) V- q' Q2 {) o  }
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    % p1 n4 [; p/ c: |4 r
  23.         printf("to server:");
      Y- X1 z' Z0 T. ]
  24.         scanf("%s", message);* ]. O+ u3 F5 R3 U1 t9 r/ p
  25. 5 }, B+ ?" H7 @0 B. N
  26.     }) W: p' h, N* s: X
  27.     //关闭socket- w$ i6 \2 G0 V0 u1 x/ q
  28.     closesocket(sockClient);
    $ ^( j! e8 s% X5 _; T- \# J
  29.     WSACleanup();
    6 ?- _. o0 X! R( v! c4 M
  30. }
复制代码
求懂的高手来解答一下。
3 X" @; j3 B- r7 H+ c4 C% K; w' l谢谢了!- |+ Y9 I7 D5 b9 g1 b

7 ~! K* w0 ~8 h3 U/ T2 A' B0 ~3 \# u! q& _. t$ |# D
: O5 s. T1 ~' }4 s5 v7 T" h# S

最新评论

admin 发表于 2020-5-9 02:33:06
应该用多线程或者多进程,,,过两天给你源代码
admin 发表于 2020-5-9 02:33:20
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
1 N4 ]! O6 A  W1 }6 u! e. srecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了

GMT+8, 2024-7-18 00:44 , Processed in 0.114577 second(s), 19 queries .

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