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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

大家好,感谢你的回复。* M+ W! G3 l6 Q& W- P! t
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。' o7 X% Z2 e1 }& F& e
Talk is cheak , show me the code.* P- z' h  K, [: h6 B
服务端代码:5 U; ~& H4 C; q7 k+ _# t9 u# N
  1. #include<stdlib.h>
    . V0 B" |* P4 O7 Y7 \# r2 c
  2. #include<WinSock2.h>1 j6 P; o6 T7 K6 Q; T, q
  3. #pragma comment(lib,"ws2_32.lib")
    ! f) a# Y0 \) b, c  d6 Y
  4. int main(){
    " V* p4 Z' @6 g$ d
  5.     WSADATA wsd;
      ^' F( {$ @1 I1 n7 G
  6.     SOCKET sockServer;; z- ^! a  i) f, K# M- U
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    3 s* G  h0 T! t
  8.     SOCKET sockClient;
    " F  E$ u3 O  i1 w9 {' {. T# {
  9.     SOCKADDR_IN clientaddr;) g/ e2 |5 W0 g* |
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    ; x9 _$ c1 V" i/ T- ?. b
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket# b2 s2 s. d5 i

  12. * q4 b4 f$ a7 D7 F: c

  13. ) F$ t8 o7 P  X, ]3 T5 S+ i0 H) o
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){; N' b7 U% \4 [# x+ }
  15.         printf("Socket has been created :%d", sockServer);
    2 @$ U$ Z$ D' `4 j8 ^) m5 f/ k
  16.     }$ @" G0 b" u7 E4 L
  17.     else{
    & r1 g* m2 d  ?2 [0 j
  18.         printf("Socket create failed.");8 d$ h# {8 e$ {) S) y" e5 C
  19.         exit(0);
    % U1 Q$ H% h, f# d  U) c, M
  20.     }# C- h3 V) I6 d6 f& I5 w; J
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);* K0 Y5 e) ], W8 g
  22.     serveraddr.sin_family = AF_INET;
    5 ^3 n0 B; |! Z
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000' g' V! [: O) g  o& {
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));2 j3 U7 B% E+ P7 P
  25.     char recvBuf[100];' O- f9 [' S, {1 W
  26.     int len = sizeof(SOCKADDR);9 x* C+ ?+ C) M% u0 J
  27.     listen(sockServer, 5);//5为等待连接数
    6 X$ ]% C; ?2 s6 P5 c) Z
  28.     while (1){
    9 K7 S  @) Y( ^( K6 E
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    - i6 V5 J& g: |- U6 N& v5 e
  30.         //接收客户端数据
    4 _/ F. I- O+ o/ q' `
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);4 l! \' l2 n3 P4 y/ f2 J
  32.         printf("to me:%s\n",recvBuf);; {6 X8 d2 J& N, j0 j+ G/ K
  33.         memset(recvBuf, 0, 100);
    8 g5 E! w, Z% V: m& T3 S
  34.     }
    7 Q' n1 _1 p8 [6 c9 i3 @9 Q* X" Q
  35.     closesocket(sockClient);
    ) M+ d: U0 n8 r: j& z- B* |
  36.     system("pause");
    % z3 M1 n3 `3 A+ ~
  37.     return 0;
    8 n3 t! e3 r6 p6 x+ ]4 Y3 P
  38. }
复制代码
客户端代码:1 ]& E" [( u% u! D, y
  1. #include<winsock2.h>
    / j1 }- Q* R8 y5 w
  2. #include<stdio.h>
    1 U0 C1 d7 ~6 k6 I5 @
  3. #pragma comment(lib, "ws2_32.lib")
    ( ~& @3 [6 F0 _( z3 k, ^* w: r" k/ h
  4. void main()
    6 w) x( ?6 y. i2 F6 V4 K
  5. {. Q8 }+ g# g8 }5 M
  6.     WSADATA wsaData;; A. q5 A  M6 x9 b, b' }! ^; A
  7.     SOCKET sockClient;//客户端Socket
    4 U$ n5 D# n6 G( P
  8.     SOCKADDR_IN addrServer;//服务端地址& P9 ?( b5 z8 ?7 C! S5 S, w4 P  e
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    ! M, A: j8 O# ?  `6 U/ C
  10.     char message[20] = "HelloSocket!";
    8 }- j, R4 y& o! ]
  11.     //定义要连接的服务端地址5 }% {+ T6 e, C" J  t. P3 T
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    : N8 u. [: c3 d
  13.     addrServer.sin_family = AF_INET;  o1 n9 A* [+ Z1 K
  14.     addrServer.sin_port = htons(6000);//连接端口6000$ I# m, m8 h& }, G
  15.     //新建客户端socket/ k; h1 V7 t5 D$ i7 r
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    2 t4 M- u! M7 i! X
  17.     int s = 0;
    4 k7 Q7 t' i, u. r( L
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));8 F8 P0 }+ ^, P2 q
  19. * V- O* U5 j1 F6 b& b. \
  20.     while (1){- t4 [0 r6 s8 g5 P' m& ]- G
  21.         //发送数据
    . d& y5 f) W6 q+ W$ m5 \( S" d
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);0 }% D# z& |  z# _' h% _/ ^
  23.         printf("to server:");
    * x4 ~( N5 M3 I/ `6 h6 B
  24.         scanf("%s", message);: R* G! v% V& P- t( j& T

  25. # ?# z: u& o: G3 y* w$ g# g1 W
  26.     }6 ~" q; L9 K& c. Q) s" V1 H" t2 w
  27.     //关闭socket
    / w# ]3 ]1 l1 r% y4 ?2 i) y* I2 s" C$ f
  28.     closesocket(sockClient);0 C; ]# o0 }; ?$ q
  29.     WSACleanup();
    8 s# z& y. H; u, j+ x# H. s
  30. }
复制代码
求懂的高手来解答一下。/ {, O7 ^6 j8 H9 J8 b4 ~
谢谢了!
% X; e. _$ J: ^1 M. z

/ S8 s$ X0 W0 g6 ~1 i" y2 j+ ]! z  F5 a; |( c" M
/ |& o6 q, \; t+ B; S

最新评论

admin 发表于 2020-5-9 02:33:06
应该用多线程或者多进程,,,过两天给你源代码
admin 发表于 2020-5-9 02:33:20
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为; w' X) m9 x+ l# e; b- i: M
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了

GMT+8, 2024-3-29 00:39 , Processed in 0.147498 second(s), 21 queries .

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