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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

大家好,感谢你的回复。( N: |( c4 V2 ^8 N+ a
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。% K0 r5 \' E9 o' G
Talk is cheak , show me the code.  l# O0 a* P6 V# p
服务端代码:
  p. n6 B) X& ~
  1. #include<stdlib.h>* s' K/ q0 }  s3 G0 A- Q: X
  2. #include<WinSock2.h>0 J& Z$ x* |# ]
  3. #pragma comment(lib,"ws2_32.lib")* S& u% a/ s7 d/ [
  4. int main(){9 g% b) u/ c8 ?. P/ t7 F
  5.     WSADATA wsd;4 z5 f" T; x9 W$ m. W4 c
  6.     SOCKET sockServer;
    9 g4 U) q* m" U) k8 {# t/ Q
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    , H7 F1 q" T* \2 ]5 \. P5 Z
  8.     SOCKET sockClient;* _5 q- s6 E7 @' @, [/ E
  9.     SOCKADDR_IN clientaddr;
    6 Z* K5 J) |6 o3 n& `+ a% k) X
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    / _; `% U. L$ M6 j' P+ y/ C! h& t
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket' R8 D' B6 z; y) s% V

  12. 1 _! u+ h" m% Y, {  O+ a! ?

  13. % B- D# W7 @  e
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){: |% x' i. W8 h; R, X0 T
  15.         printf("Socket has been created :%d", sockServer);5 I! A" c4 d: h1 r/ O! ^9 o
  16.     }+ @; O1 `+ R$ L0 l/ W5 z
  17.     else{3 C( N9 y  Q: i0 v" h
  18.         printf("Socket create failed.");8 M4 u$ w3 J  b3 _5 i, A7 R
  19.         exit(0);
    , d' z, A. F: m
  20.     }8 Z1 t1 H( u4 M: a8 K; [! S# X
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);5 g+ i# m0 L9 U8 r% y$ l
  22.     serveraddr.sin_family = AF_INET;
    . c# T4 g9 n4 `0 `' X( v
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    5 v5 w$ f3 F% s# `
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    " m1 f3 H3 u' l
  25.     char recvBuf[100];
    " d6 f( l# U" K$ O) M
  26.     int len = sizeof(SOCKADDR);7 V( n; O( P% ]' n+ Z4 J
  27.     listen(sockServer, 5);//5为等待连接数+ k2 E4 k: k$ K# {; H: k
  28.     while (1){' `$ ]# z8 x8 n  t
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);7 A) I9 z! I6 s: U8 m* M" G
  30.         //接收客户端数据" n- B" y! ^8 K' m- X' K
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    . U; L9 ~8 x8 o7 d6 `  I
  32.         printf("to me:%s\n",recvBuf);
    " e0 s- S. P7 M/ s$ C
  33.         memset(recvBuf, 0, 100);. s' {0 b- P. N% \+ c1 W9 N8 V
  34.     }
    9 f5 O& {( `, K& m8 A
  35.     closesocket(sockClient);
    : q  t) C) F  [3 ]$ L0 q
  36.     system("pause");/ ]* j; Z* \* m3 D
  37.     return 0;
    ) h6 m6 O5 b- H0 Y& ~9 Q& t
  38. }
复制代码
客户端代码:
( T7 R1 [5 d( M% M+ a
  1. #include<winsock2.h>/ ^: P. C1 U5 D% s- s$ Z
  2. #include<stdio.h># ?$ W6 c2 t4 h+ F' g  q. @! [! k, S" Z
  3. #pragma comment(lib, "ws2_32.lib")6 R- B' b" P$ k5 D3 G# {
  4. void main()& c4 f" n" d& j5 p
  5. {
    9 G7 U! h( v5 e9 |  I" a3 G, y6 [
  6.     WSADATA wsaData;! b" _$ c6 F) g2 A. D! ?
  7.     SOCKET sockClient;//客户端Socket
    - Y8 @! ~4 ^) q4 x' ]. i
  8.     SOCKADDR_IN addrServer;//服务端地址/ u# y; d( o3 C" |# n
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    5 C$ `  ~8 b" N4 L" h( }$ [
  10.     char message[20] = "HelloSocket!";+ p8 D, \7 W4 _) E! D
  11.     //定义要连接的服务端地址
    5 A4 ]7 [: I) E- u# [- {! c/ P* s; Y
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    : i3 J& T. v  q; ?# h: [
  13.     addrServer.sin_family = AF_INET;6 X5 K/ X  u3 Z* l, c9 w
  14.     addrServer.sin_port = htons(6000);//连接端口60007 E' T: j5 R6 ?$ G7 f. P: v+ Q2 I
  15.     //新建客户端socket
    , B& I3 J0 U0 U5 F2 g; \$ [5 `
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    ' m+ o. _9 V9 v4 A5 L
  17.     int s = 0;4 ]9 Q* [: R0 ^. d
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    ' {% [' h$ \$ X7 n4 f& l7 j' R

  19. 0 ^6 f% S( V8 O
  20.     while (1){
    % j7 _9 Q* a" [( B
  21.         //发送数据
    , l& y5 Z8 ?0 Y2 Y
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);4 E( E( J7 {  Z( F. m, V
  23.         printf("to server:");$ g0 S+ L0 L; ^: Z1 Y9 K" v* X
  24.         scanf("%s", message);
    * e! r0 c1 _. t7 ^

  25. 6 L/ N  d# j5 l8 h
  26.     }( _0 O! ~* x! F9 L' D2 b
  27.     //关闭socket+ r( x# p6 O3 z4 h, K1 s
  28.     closesocket(sockClient);
    : w; k' Y; j. R7 G8 |) [  y. E
  29.     WSACleanup();) u. s4 F5 |; L  K2 E% o$ o0 J
  30. }
复制代码
求懂的高手来解答一下。/ o+ a! }1 @; i
谢谢了!. P# r9 Y6 Q$ |/ X- J

& b1 ?/ A  I3 B1 w5 M! q1 E" P- V4 q% q  \4 h# v: O
  g# a* A9 ^: D

最新评论

admin 发表于 2020-5-9 02:33:06
应该用多线程或者多进程,,,过两天给你源代码
admin 发表于 2020-5-9 02:33:20
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
4 z8 ?  D, \/ `! S" ~% Y  Yrecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了

GMT+8, 2026-8-5 01:12 , Processed in 0.065937 second(s), 18 queries .

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