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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

大家好,感谢你的回复。
9 q3 p$ P- b( ]6 ^我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。# U3 ~2 G  Z3 ]1 c
Talk is cheak , show me the code.: Y! ?5 i$ H$ o  Y; F
服务端代码:
$ I& _; Z2 O( y8 U
  1. #include<stdlib.h>  N) r0 R* b7 h- f
  2. #include<WinSock2.h>; ]  D" l; H! m% \$ ~$ V) M, l) |
  3. #pragma comment(lib,"ws2_32.lib")
    / c* m9 ]0 m3 y3 T
  4. int main(){
    1 f8 g  ]$ _) B* _- x- l1 p" f
  5.     WSADATA wsd;: q+ D$ C1 G0 A5 `
  6.     SOCKET sockServer;
    6 w7 V& n$ {0 F9 |" i6 k
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号  E$ F- U! O+ {  J
  8.     SOCKET sockClient;  I6 `4 g' g+ ~6 L- B4 B. M
  9.     SOCKADDR_IN clientaddr;
    . a' Q  t  \/ ~; I8 b0 e
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    % j: u+ C8 t/ t& S6 }
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    # R! e! [; d. i3 E# M( v2 J

  12. ' X$ ?; t( a' u6 d
  13. " \0 k) s* M0 @% Z" [5 Q. A! u
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    " ?0 c5 K% h) O, U& A8 {+ l/ _
  15.         printf("Socket has been created :%d", sockServer);
    ! A" T3 h  G  }0 J4 m& F# T6 \
  16.     }+ k' C, s0 [9 d' g/ H% y9 h
  17.     else{2 K! M. }! s' g5 P) X
  18.         printf("Socket create failed.");% U5 U% Y0 {: L. i
  19.         exit(0);
    9 ~6 K- G* y4 j  d
  20.     }6 I" _! e9 ^' j/ B5 v- z
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);: E; H4 D4 V1 i2 c1 k, i
  22.     serveraddr.sin_family = AF_INET;
    # j( r$ g) ~3 \& w
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000% S& J7 J( H4 i: Y$ E" _
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));) u) Z: @8 R/ G* a2 Z: L# A; L% z
  25.     char recvBuf[100];
    - [0 T+ C9 h+ B; o
  26.     int len = sizeof(SOCKADDR);8 A! b2 i' q6 u' u3 v
  27.     listen(sockServer, 5);//5为等待连接数3 }4 N7 ?: U8 g& Y; E$ y
  28.     while (1){
    / X( l2 h0 O, ?# o! X. v
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    : V; Y6 v7 A  H7 u$ E- L
  30.         //接收客户端数据" o+ [  [- [  q* y  u
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    ( x, I1 m% L$ O( q- k
  32.         printf("to me:%s\n",recvBuf);
    ( a/ _' I# d+ J, _
  33.         memset(recvBuf, 0, 100);
    5 N0 n+ R4 m0 h2 N
  34.     }" ~2 m, C2 |+ _: B1 z
  35.     closesocket(sockClient);
    9 S" D" ]" V+ b% f  [
  36.     system("pause");
    " h2 B/ V4 T/ \9 b& s: r3 g3 \8 K
  37.     return 0;
    ) j: p: H) ~' P, ~0 z) A
  38. }
复制代码
客户端代码:
' _3 L5 n; F0 M: P3 L/ D
  1. #include<winsock2.h>- H: d4 o% s, y$ U5 e
  2. #include<stdio.h>; ~8 |3 R: f  q/ ?, [0 A/ H$ z$ `
  3. #pragma comment(lib, "ws2_32.lib")8 a5 ]( K2 u+ G+ C, y1 G
  4. void main()+ c* e- F6 A/ ?% R
  5. {
    3 f0 O1 M4 y! j7 h8 q
  6.     WSADATA wsaData;" O3 L) Z" A8 v, d( O
  7.     SOCKET sockClient;//客户端Socket
    ; l4 q* }3 y* `6 X- j( W! t: q7 y
  8.     SOCKADDR_IN addrServer;//服务端地址
    : U- h( [" V* a: ~; T, M
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    3 X9 m9 m" B" v1 z6 D' G5 T
  10.     char message[20] = "HelloSocket!";
    . X3 S* P& N! p
  11.     //定义要连接的服务端地址$ P$ s2 A$ I& C' F
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
      ^8 m0 ?' V) S: D7 q( }4 j. l, V
  13.     addrServer.sin_family = AF_INET;
    : D% \1 q5 m, c" Y& F
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    ; a# M9 [1 u* `; |% [5 v
  15.     //新建客户端socket% N% t- N. C, g
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);7 |- q. @, @0 L
  17.     int s = 0;
    6 [4 ?- |- K* t  N) c8 G9 q
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));+ ]/ }; Z+ I# P' H: T
  19. 3 c* u3 a7 S& H- j' C% J
  20.     while (1){
    , u" M9 b& }6 X1 R  c" y: I
  21.         //发送数据
    7 P1 z& m( r- c# G" t$ V) x/ t5 S: s
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);( v  I4 b! o( S7 L# E  A
  23.         printf("to server:");$ J6 f" n7 ]5 ]' _4 m
  24.         scanf("%s", message);
    4 A! T4 d, S/ o! j/ K3 T! J

  25. 1 B4 K" W2 K9 J7 W5 ~( H
  26.     }
    1 R2 ^: K! k) _3 g# n  v; ^* {
  27.     //关闭socket% _' ]' g7 D2 i
  28.     closesocket(sockClient);
    , i8 @. `+ R/ e
  29.     WSACleanup();( u0 N" K% q& ^  M( z, O* p
  30. }
复制代码
求懂的高手来解答一下。& }# n1 d4 l- z/ t) i+ J6 D
谢谢了!7 G0 e5 Z* R0 W/ H. n+ Y" M
5 E6 `* k! a0 Y  h' a

# m$ D' z5 U1 o$ E  H! I/ T
; D9 X, [& }3 ^1 ]) Y

最新评论

admin 发表于 2020-5-9 02:33:06
应该用多线程或者多进程,,,过两天给你源代码
admin 发表于 2020-5-9 02:33:20
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
; H' C0 m; F2 M" n$ q# r6 o9 F( J0 }recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了

GMT+8, 2026-8-4 07:06 , Processed in 0.072142 second(s), 18 queries .

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