cncml手绘网

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

作者: admin    时间: 2020-5-9 02:32
标题: C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。. r  x, r4 c6 z8 V" w
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。: r) L# P; c1 S" e2 ^) ^8 J* U
Talk is cheak , show me the code.
6 w6 _, R3 c, x- ]3 N服务端代码:) K$ g8 }& C7 `2 }
  1. #include<stdlib.h>
    ' W( P  y# \1 r: }' e1 g
  2. #include<WinSock2.h>
      ?' M" H1 P7 c: I4 s
  3. #pragma comment(lib,"ws2_32.lib")
    0 j6 m8 a  F" k. Q# e
  4. int main(){( z2 d. r& `0 ~9 f$ x/ G" J
  5.     WSADATA wsd;
    . C( ]: n. S7 T" C
  6.     SOCKET sockServer;9 s% }  X; K1 ?& g! u3 j" ]
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号5 p2 F/ n9 ]  I! G( [; C% E1 @
  8.     SOCKET sockClient;
    / ~# p/ J; i- S+ `1 c6 ]
  9.     SOCKADDR_IN clientaddr;
    7 w: s! b- C5 K+ n! Y, d; a, g/ B
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口2 I6 d- n' c- C$ c  e* C
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    2 j+ e* N$ q( Q- J6 _

  12. + w  k  f, p; z( f7 B

  13. 9 J# ~/ p+ y1 U- ?  Z
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    : Z# c" Y- O9 b- r& L
  15.         printf("Socket has been created :%d", sockServer);# K0 u% j& K6 r, b' ~6 P
  16.     }
    * d, |! E4 ]3 G
  17.     else{
    ' [: y" t  `4 }+ T/ _
  18.         printf("Socket create failed.");
    3 J4 `4 L+ o% o2 ]" X; k
  19.         exit(0);
    % \  r' G9 r+ d/ w( _6 Y; `5 b1 h
  20.     }8 l5 e2 U! y0 X3 n6 k
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);" V; p, ?$ F* j
  22.     serveraddr.sin_family = AF_INET;
    , n* l9 v  w7 w* a- m
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    0 A1 q  I2 b" ?0 S# L
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));6 {4 m9 b" Y5 Z! _
  25.     char recvBuf[100];) k2 i. l" A( M" S6 y9 K2 F
  26.     int len = sizeof(SOCKADDR);+ p2 C7 H' Z' Z* ~
  27.     listen(sockServer, 5);//5为等待连接数
    / w5 J7 l0 S. j3 K( L" p
  28.     while (1){
    : R% _8 a# W$ C
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);: [# Q  \& S( }2 J. V- r# O
  30.         //接收客户端数据
    $ X# m3 X3 j) {# ?$ A% u/ O
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    5 H0 ?) L) P# a1 v
  32.         printf("to me:%s\n",recvBuf);
    # ?, i3 J/ ]! r2 X, q# E7 e! i
  33.         memset(recvBuf, 0, 100);' v  A3 l3 o/ G6 f" I) S
  34.     }
    ' w3 k. M. @5 u0 D  I" w* [, H
  35.     closesocket(sockClient);+ m: s' P% R3 b9 s
  36.     system("pause");
    2 C2 i7 D! M% B1 L" k& X) ]; h" R
  37.     return 0;
    " ~5 }' {+ i: g, d, D
  38. }
复制代码
客户端代码:3 h. K% ~+ i' d  J# z# R  [
  1. #include<winsock2.h>
    - n7 D" f! U; O3 i
  2. #include<stdio.h>
    3 t7 e2 W$ T6 u( s$ G+ Y
  3. #pragma comment(lib, "ws2_32.lib")0 {% S5 m- V' s4 e
  4. void main()
    1 g1 @9 a% }/ X$ i
  5. {+ ^8 G$ [* X; v$ v$ P
  6.     WSADATA wsaData;& k5 m% E3 m1 L  C  w' k
  7.     SOCKET sockClient;//客户端Socket
    ! M" d8 O0 C  M
  8.     SOCKADDR_IN addrServer;//服务端地址
    # y9 u0 T7 ?+ C! ]8 e2 S
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);* k2 n! E$ ]7 m# q6 T
  10.     char message[20] = "HelloSocket!";
    + V( `' Y& `/ h+ y% w1 w2 s0 ?7 M
  11.     //定义要连接的服务端地址
    ' U6 a  ?) i: T. a1 i; T/ |/ g( s
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    1 X' a- R6 K8 F# Z% E' L2 |3 B
  13.     addrServer.sin_family = AF_INET;
    2 c5 M, ~* u1 [, p( W8 t+ u7 {
  14.     addrServer.sin_port = htons(6000);//连接端口6000, u4 v# b1 C% I) E4 [& S
  15.     //新建客户端socket" I6 d. |9 Z2 L0 }, v) S
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    ! n. _8 |. ?0 Z+ T
  17.     int s = 0;: T1 t1 D5 V6 v
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    ) g" T1 ~+ c! R2 X

  19. & G8 O, Q- H# W; C& n" q. R
  20.     while (1){
    . T2 C* l, n+ s7 n" i: ^9 N9 _
  21.         //发送数据
    9 L5 g# _# l7 b. Y$ R- E' X% Q
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    2 p+ N  A# H7 Y) w; `
  23.         printf("to server:");& D1 f" J/ Y: O; {- z3 x: y7 ^
  24.         scanf("%s", message);; }) m8 k0 d5 p+ P) `. n9 i% ?

  25. - G0 }& q; P- B# v
  26.     }
    + u& e: e2 \+ k% a& x% u% c$ e* j$ g
  27.     //关闭socket
    - P5 r" B- m  K# D% Y0 p' m
  28.     closesocket(sockClient);7 u. T9 R& P  ]5 K9 p" ]9 }
  29.     WSACleanup();1 U1 H4 {2 d' I) _1 J0 z" R" d
  30. }
复制代码
求懂的高手来解答一下。0 _: M  Y3 H/ A+ _5 R/ s' D# I3 l
谢谢了!' D3 S( f' F8 w' }

' C; r/ y, }4 W% T9 i& S
4 u9 L- |* q0 t
# n# m8 U! v9 ~5 i: Q" a: I0 F0 @
作者: admin    时间: 2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者: admin    时间: 2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
* E) h9 f( L2 |$ P: p: g' S# Y  Irecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了




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