cncml手绘网

标题: C语言 socket 编写简单服务端客户端通信问题 [打印本页]

作者: admin    时间: 2020-5-9 02:32
标题: C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。
7 J5 l) H" k( h, }0 c  A我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。$ z% x- S& Z/ }. U
Talk is cheak , show me the code.
* }$ Q2 R- v/ }! t- }$ H$ H5 H0 @% l; W服务端代码:2 O9 R( R$ T. j" k1 U$ m
  1. #include<stdlib.h>
    ! _3 [/ R* a  h: C
  2. #include<WinSock2.h>& s4 ~# i. @4 w
  3. #pragma comment(lib,"ws2_32.lib"). j/ N  m( M% U8 M3 }6 ]
  4. int main(){: }  t- V2 d' s" J8 C& P% i
  5.     WSADATA wsd;. u( E6 @' y+ H$ M/ N- F' P
  6.     SOCKET sockServer;
    $ |. r" l! a. {( u. F1 J+ Y
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号- v+ h) x* J. N7 j% j: c. d, c; s
  8.     SOCKET sockClient;
    / `3 N' a1 ^2 Y5 @( }
  9.     SOCKADDR_IN clientaddr;
    8 l" a" ?- E4 m+ S' d
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    ) D" W  `  N. V! H
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    # ~. f. W/ Z# x

  12. 9 K5 v1 l( B! e$ W
  13. 1 f8 Z  C- @9 Y
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){4 v; `) ^0 V, X' ]  o% w
  15.         printf("Socket has been created :%d", sockServer);
    ; h  @0 @2 K/ x9 \  c
  16.     }
    ' w+ {- |5 T2 O3 ]8 }
  17.     else{
    % T+ \1 o/ t& S0 |3 m+ h9 A" z5 D$ V
  18.         printf("Socket create failed.");3 d7 z! Z2 [2 Y# [, Q4 N* `
  19.         exit(0);
    " i- s- _4 b+ D* M
  20.     }& _3 `$ R2 H$ j! o$ h( P% l+ B: M
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);5 e$ O5 x+ y" ^1 F
  22.     serveraddr.sin_family = AF_INET;6 |9 T- v' j: ?' ~! [
  23.     serveraddr.sin_port = htons(6000);//绑定端口60006 j# \  y. `6 u& J' j% t+ \' w
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    ) v$ E" P8 ]: X: r
  25.     char recvBuf[100];$ U0 g& p; ]' g
  26.     int len = sizeof(SOCKADDR);4 z" U  \; V4 m% i  `. @
  27.     listen(sockServer, 5);//5为等待连接数
    ' C% U3 m7 [% ]. n1 j. m6 w
  28.     while (1){) ]! A4 X" z! U
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    9 }& |5 N5 i- C! ^' S0 _
  30.         //接收客户端数据
    8 i, O3 V9 {) S. I2 d
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    5 S: G1 |3 ^# l# `! t+ _% H$ ~* T6 g1 U- B
  32.         printf("to me:%s\n",recvBuf);' Q9 T6 H9 m2 D3 y
  33.         memset(recvBuf, 0, 100);6 v. ~% h# a0 G: [4 @
  34.     }
    1 n9 f/ D! {6 c+ l! T# K
  35.     closesocket(sockClient);6 h6 D1 b, m" a/ M$ A& {
  36.     system("pause");6 n. z- U# {- `# i, s" z
  37.     return 0;4 D1 a0 m) W, d0 D, A
  38. }
复制代码
客户端代码:
" U6 ^. K" K0 R$ N/ E4 a9 q. b
  1. #include<winsock2.h>
    7 m1 ~( ]1 H, N+ ~. r3 d
  2. #include<stdio.h>
    ! W3 \( e" b9 y) \( ^6 I: X
  3. #pragma comment(lib, "ws2_32.lib"): {: H3 e' P8 W
  4. void main()0 G  \9 H9 t+ a# _% P
  5. {4 P1 r" a; f2 g8 V2 U
  6.     WSADATA wsaData;
    ; j% X/ u$ a  j( g# d
  7.     SOCKET sockClient;//客户端Socket: v$ \' |) B! C' z7 V* R4 g  {
  8.     SOCKADDR_IN addrServer;//服务端地址3 h0 X# u6 L6 W# ]- j- ?
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);) I9 v2 a& Q: _6 E# c/ J
  10.     char message[20] = "HelloSocket!";6 l. `* v$ @) K9 V0 g* G
  11.     //定义要连接的服务端地址
    " c! c* A: H, Z' V0 D5 X
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    ; {3 m8 _1 t: s( e5 n- f# C
  13.     addrServer.sin_family = AF_INET;. I9 O6 O% K$ Z! b
  14.     addrServer.sin_port = htons(6000);//连接端口6000. w% B8 ^3 A, w4 F( b* q
  15.     //新建客户端socket
    & Y* S2 O; b9 ~! ]6 A3 S4 D
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    4 p5 a: u  P) D0 }/ {# B
  17.     int s = 0;9 \/ b/ a* S. _
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    ) ^  k$ G3 E: c6 S/ q+ C( ~

  19. % H! p* ^& B# \5 N# U
  20.     while (1){( Y7 q  |6 t7 z2 I+ ~5 _
  21.         //发送数据  v" E% H8 G9 K  y3 k/ l- Y
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);" a7 J1 ~7 c& N3 Y# m& D! A
  23.         printf("to server:");
    # u# e" Z8 B) w
  24.         scanf("%s", message);
    , B' `( _8 G7 n( q

  25. , _; c# v. d5 f( c- X
  26.     }
    3 n9 d) ?8 l& O
  27.     //关闭socket
    ' k; ?* r6 U: N
  28.     closesocket(sockClient);& t7 O: ?* P2 U. y0 z: {. |6 g; m
  29.     WSACleanup();% g6 l. r, ?% }
  30. }
复制代码
求懂的高手来解答一下。: }% n1 K  y1 D+ h# a5 h& c" v
谢谢了!6 A, z) ~7 s0 N! X: g+ \
( W$ J0 x3 V7 N; L! ~3 I0 V+ b
% e6 m% a! U0 ~$ [  c; v

6 f6 s; w1 U* S* K5 i( M4 A! w% e
作者: admin    时间: 2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者: admin    时间: 2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
. r: W2 I6 f5 @) V6 Qrecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了




欢迎光临 cncml手绘网 (http://www.cncml.com/) Powered by Discuz! X3.2