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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

大家好,感谢你的回复。
5 m! e7 {& D1 u2 z( V/ y% U+ O2 p我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
3 P/ a+ L1 {' ~" O+ c$ ~$ a  f1 TTalk is cheak , show me the code.6 P$ X$ K( j3 H" n
服务端代码:
* D7 p: ?7 x$ h6 b
  1. #include<stdlib.h>% v) z& }9 w) L& `$ V
  2. #include<WinSock2.h>8 c" l# d8 V! q- O
  3. #pragma comment(lib,"ws2_32.lib"); y1 K. L. C6 }  ~( l" [& `* m5 U
  4. int main(){
    & |% i8 f+ S+ x. ^+ x! u7 ]
  5.     WSADATA wsd;
    ; v" J0 v3 g; ?9 Q8 a" `
  6.     SOCKET sockServer;
    9 ^1 M  x) P" i2 T
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号. b* o+ Q, l0 K% `% O+ N
  8.     SOCKET sockClient;
    9 m. M( L1 U! Y- A
  9.     SOCKADDR_IN clientaddr;
    ; v" j$ W) T, i5 G7 r6 E8 H
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    + _* W  n7 v2 _, ~% k/ h
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    1 Q* p8 n0 E7 w2 `4 y
  12. . p3 O; x7 B" h; {: l% c

  13. . C' s3 A0 q, [# Z2 Q* ^$ X
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){( l9 y+ y1 w6 P3 e7 \( F0 m1 O
  15.         printf("Socket has been created :%d", sockServer);
    , Y4 r  D0 A0 g2 P; J7 x
  16.     }2 S; y) w+ u7 f* |% x
  17.     else{
    . Z& b: v2 r2 `! d# h3 g
  18.         printf("Socket create failed.");
    6 t6 d6 [3 e6 D
  19.         exit(0);
    " ^  d) a: A' x8 ~  Z3 @
  20.     }) X, A2 \. W7 R0 P" u: ^) u& |
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);! ^' R/ X  u5 ^0 N$ a
  22.     serveraddr.sin_family = AF_INET;. u3 D6 R. ~, W# l- o$ x6 P
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    # d5 I% y8 l- Z
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    # H! E" [5 h( V* {( i
  25.     char recvBuf[100];$ }8 R* ]9 o/ H# x0 y
  26.     int len = sizeof(SOCKADDR);. ~+ ~' Q( X& n, v$ t% p. n
  27.     listen(sockServer, 5);//5为等待连接数! L6 B; \; Q: r$ U4 m4 }
  28.     while (1){1 Z6 h/ b, d4 ]# o' N
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);2 T6 Q5 U8 J, z0 A7 F$ h  A
  30.         //接收客户端数据2 Y- d7 d5 \% Z! {
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);% u* h. S$ b3 d3 c1 u
  32.         printf("to me:%s\n",recvBuf);3 J, c0 n. h' D5 p
  33.         memset(recvBuf, 0, 100);
    5 W1 h3 {- Q' i( x% v; I- _
  34.     }% D1 ~. H+ S3 N( u! M9 O" K
  35.     closesocket(sockClient);* _% k% e! @7 y1 x
  36.     system("pause");; E8 c7 H! L  {/ \/ `! h
  37.     return 0;, _6 m+ }0 o$ S5 v
  38. }
复制代码
客户端代码:
6 F" p3 J$ o. Y6 `# D
  1. #include<winsock2.h>
    . u  v% W  j! S9 |4 S. |) _
  2. #include<stdio.h>
    : L  x  g8 o; C% K
  3. #pragma comment(lib, "ws2_32.lib")$ w# U  @" K, Z) M3 t* F# F7 D
  4. void main()- m7 i: q2 f# E, `/ C) O, f' [
  5. {& H0 W3 S2 g8 m( i1 ^+ a9 e6 f1 e
  6.     WSADATA wsaData;8 b' U+ H  Z5 j' X' T" g8 d
  7.     SOCKET sockClient;//客户端Socket# B* n" k+ }+ e+ T( q
  8.     SOCKADDR_IN addrServer;//服务端地址
    ( j' e! C! C# E! R* ?  M+ M
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);9 y, Y2 K! Z$ i. }+ @' H* ^
  10.     char message[20] = "HelloSocket!";5 n" L8 R3 i9 h3 t
  11.     //定义要连接的服务端地址* L# C' ~3 y1 C4 s! @2 s, g, r- x6 l
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)9 y& S. O8 T5 H+ \; V
  13.     addrServer.sin_family = AF_INET;
    , j& V. n. D6 g5 w+ Y9 O- {. D
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    % h" o" @/ w, V, O4 Z7 m. x
  15.     //新建客户端socket7 L6 h1 [' u, Y2 E6 N8 }
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);( r' l5 {9 T; a* T2 _% Q
  17.     int s = 0;
    : j- V+ _3 |7 k3 d, V" E: h
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));% j  M6 p, l) T8 q9 J+ y, u
  19. 7 O+ i/ @, @8 Z( l9 G% I5 p
  20.     while (1){/ [  _7 |- [+ j  m" g1 S
  21.         //发送数据6 S/ Z! ^. H. G
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);  r4 v- M* v& H: D6 ^
  23.         printf("to server:");3 U0 ?/ _" i0 A+ h4 F
  24.         scanf("%s", message);
    . `7 l; z* \$ a7 N% P6 [
  25. ) y5 r' |4 s% a+ B2 Q1 z/ Q
  26.     }
    % W8 w& Q3 E) @/ d  ~
  27.     //关闭socket: H1 b. O% ~8 v2 D$ a9 Q
  28.     closesocket(sockClient);
    ; W9 j/ L* T9 m: i
  29.     WSACleanup();# U$ u3 Q) B3 d  P2 U2 Q4 H
  30. }
复制代码
求懂的高手来解答一下。
" S' `* A8 C! G# V4 R! G谢谢了!
( \% I7 g9 Y* _7 \% R1 L5 g9 M

' @, C! Y, `. s4 ]4 X
8 ]6 F6 P5 A/ s0 \* D, r5 }; R# {  O, k& O# }

最新评论

admin 发表于 2020-5-9 02:33:06
应该用多线程或者多进程,,,过两天给你源代码
admin 发表于 2020-5-9 02:33:20
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
2 _; C6 x3 M( r7 s) s2 {6 x$ Krecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了

GMT+8, 2026-9-20 23:53 , Processed in 0.063336 second(s), 18 queries .

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