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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

大家好,感谢你的回复。
1 _* M: C/ C1 s# U* E6 N6 }8 E我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。( H1 G) b4 k- g( v
Talk is cheak , show me the code.1 M% A! U0 u, O' m4 ~! y, k
服务端代码:0 `, N+ R/ i: N" j9 d& L
  1. #include<stdlib.h>) V/ K3 X' f' R/ M' ]
  2. #include<WinSock2.h>
    & b8 u& P6 ~! o" G
  3. #pragma comment(lib,"ws2_32.lib")
    - V3 q$ C' S  b2 B8 Q2 m
  4. int main(){( e9 B$ y1 f% ^+ c4 t$ [7 Q+ v
  5.     WSADATA wsd;
    " ?* v+ K8 J0 L- [! s/ @
  6.     SOCKET sockServer;
    ! @) X0 Z$ c9 l
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    7 S: [! F# _. ^$ P" c; y
  8.     SOCKET sockClient;
    - Y) \  H' V% f1 ]
  9.     SOCKADDR_IN clientaddr;
    % N2 x! V" L# |7 Z. H) E
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口+ u, O$ v+ {5 K5 @6 @- D- k& d' j1 \
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    ; u. M9 S, \* H, M* @! G, G

  12. " `/ G0 n* X- k5 o
  13. ) J1 G  b& K2 w9 R  s
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){& s3 x# H5 C% l
  15.         printf("Socket has been created :%d", sockServer);+ X/ y0 t3 f8 x; F
  16.     }
    " i8 b9 M2 X: I& @3 l
  17.     else{
    ! U: Z* M0 |& S" }
  18.         printf("Socket create failed.");
    * m5 }2 j/ Z+ w! {; J
  19.         exit(0);5 M/ _, o$ Z, Z- ]7 _* ^/ M
  20.     }4 F4 ?0 ^5 p& C# C
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    ( o3 x7 Z. b0 a- f
  22.     serveraddr.sin_family = AF_INET;
      s/ N& I- i$ {6 ]2 ]; r% o
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    2 t. b" o5 y4 f- Q
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    ( k: f! k7 m. H$ q. g  E3 D' F
  25.     char recvBuf[100];. |2 h, Y8 ]8 Q9 U
  26.     int len = sizeof(SOCKADDR);7 t2 n6 T$ a/ I4 [/ _/ }3 J
  27.     listen(sockServer, 5);//5为等待连接数2 y6 [9 \" A* K
  28.     while (1){
    & U" P7 I* H5 ~) J
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    " f9 t1 s  L; Q3 j0 M
  30.         //接收客户端数据" h' ?* }, T# b
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    & r$ w' I  k; M9 t
  32.         printf("to me:%s\n",recvBuf);
    4 {) l) t4 p$ S
  33.         memset(recvBuf, 0, 100);4 V4 u1 {( D% T8 H
  34.     }
    & S3 a) ?# z5 f) x
  35.     closesocket(sockClient);
    7 T* X, a" B$ q) y3 f/ Q
  36.     system("pause");
    3 i1 X8 H$ K5 Z
  37.     return 0;
    2 i+ E) m  F6 j! i1 p* s8 w# a
  38. }
复制代码
客户端代码:3 o: X. O/ E0 j7 H3 @
  1. #include<winsock2.h>
    3 C1 N8 M6 Z9 h, Z
  2. #include<stdio.h>  q0 w# M6 [* E4 n9 V* f
  3. #pragma comment(lib, "ws2_32.lib")
    $ n* E2 s! J6 h
  4. void main()
    , G* @$ K/ `" W8 j3 s0 H. d( y: L
  5. {# e" o- W" O* `
  6.     WSADATA wsaData;. l5 c  ]' ?* q8 N: d
  7.     SOCKET sockClient;//客户端Socket
    ! a! H$ W, O( W* J  A9 m; Q
  8.     SOCKADDR_IN addrServer;//服务端地址
    , _& p* }6 E8 [8 c1 I- P
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);! w& g7 N6 X1 B8 c- E: o5 m
  10.     char message[20] = "HelloSocket!";
    # S; T; L) i2 I% R+ j1 t1 q8 m2 L" R
  11.     //定义要连接的服务端地址: a+ M! h# z/ h- R+ P; p5 o5 n$ I& X
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)' s" D2 V4 c+ T. _1 _: i( u
  13.     addrServer.sin_family = AF_INET;& j* ?7 B# {) z
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    / P3 r6 e) u  ^! H( E9 _
  15.     //新建客户端socket: {; U* w. ?" j+ L7 r0 [% ?4 t
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);3 C0 ]. p8 N4 Z8 G+ L* F$ q8 _
  17.     int s = 0;
    3 e! X' [0 u- p: }9 ?0 l& _# w# N
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    3 y% v& u) l$ Q) V/ F# a

  19. ( _; l! W# {/ ?4 o' N7 {* Q. R- b8 u
  20.     while (1){, Q6 i' U- ]9 C7 x* f1 e! x
  21.         //发送数据
    . r; v8 Q9 K; |9 w, X7 U. l
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    4 W7 ^( x. A# U- A- [% q7 Q. O- I
  23.         printf("to server:");
    9 x% o! [% G" m1 L1 G# z" W
  24.         scanf("%s", message);! y5 \+ m9 E% z/ _& e; l

  25. 9 m# L  v' u$ F
  26.     }  G7 v. g4 L! C- a8 U
  27.     //关闭socket
    0 c  F0 b; V9 [# L0 H5 k
  28.     closesocket(sockClient);
    8 E' k! j0 A" b5 T; i1 e
  29.     WSACleanup();
    2 i; S/ v6 b3 N' V
  30. }
复制代码
求懂的高手来解答一下。
9 c4 R7 _4 d, ]) m4 `# a谢谢了!
# w/ Y. i) Z0 [) Q+ T% `
. u* d2 K) |, P3 l) _4 q4 o5 ?
8 M3 y' C8 ?& w1 m, ?, Y
8 L3 O  U$ |% P' S, s! a

最新评论

admin 发表于 2020-5-9 02:33:06
应该用多线程或者多进程,,,过两天给你源代码
admin 发表于 2020-5-9 02:33:20
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
; _# S5 x& r& c" J* precv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了

GMT+8, 2026-1-30 11:25 , Processed in 0.057632 second(s), 20 queries .

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