cncml手绘网

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

作者: admin    时间: 2020-5-9 02:32
标题: C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。7 y" v* ]# V8 T8 y/ Q4 Z7 I
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
) b* g8 g/ ?+ p. N- F3 Q9 aTalk is cheak , show me the code.
" c  H1 o4 f  z" v) H服务端代码:% a% m6 X6 R& r- H0 p
  1. #include<stdlib.h>
    ! U4 x, b$ Y& Y; W
  2. #include<WinSock2.h>5 r7 Y5 ~+ t9 Q5 Y
  3. #pragma comment(lib,"ws2_32.lib")4 X: x6 W4 I' h: F  Z0 n8 a
  4. int main(){
    1 b3 }7 ~4 _5 y
  5.     WSADATA wsd;+ ^, f0 U( G0 E7 \) _) E# L1 k- ~# P. S
  6.     SOCKET sockServer;; q! U  I9 P4 t2 T
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号; H! X' Z  D- a
  8.     SOCKET sockClient;% M1 ?# K7 n5 W. e$ u" N
  9.     SOCKADDR_IN clientaddr;0 m0 q' K9 A1 n- O1 ]; \
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口; s  W& ], i1 |+ c8 P# c% M1 x+ Q( E
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    $ |' t7 D& h6 L  ~6 ?6 H

  12. # q( y" M- U; L! A

  13. 1 T7 `4 I" G! Z1 i: b1 w6 w
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    # Y+ T* z1 t% {4 W: ]4 \$ N
  15.         printf("Socket has been created :%d", sockServer);+ r( ~5 _9 I! B9 ~
  16.     }/ ?/ U- m7 T; F3 a$ b$ u3 m% H( p6 f
  17.     else{
      T" ]0 f+ e- d3 }3 R/ A
  18.         printf("Socket create failed.");
    " }- s) H* m0 B
  19.         exit(0);" ], Q+ p7 O8 b# \/ `
  20.     }# j  z. P, x) d" i; ]. C
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    $ B/ f  v5 f  C, X
  22.     serveraddr.sin_family = AF_INET;
    3 E" O6 B- {  |4 H7 q2 S8 M
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    " s2 a$ a3 L' N1 ]# n5 X
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    ; p9 Y: S* v/ @' G, z" Q0 V7 J: j
  25.     char recvBuf[100];1 v% |" g3 t, z8 e$ M1 s& d0 n+ R
  26.     int len = sizeof(SOCKADDR);! Z3 E) l, u" ~4 ^) A, Y
  27.     listen(sockServer, 5);//5为等待连接数
    % m2 z* y- c2 Y$ Q* ~
  28.     while (1){9 Y( a2 f+ d, c+ r
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    & }5 L7 s+ b7 _+ \* Z; T( h
  30.         //接收客户端数据
    1 `$ I( M3 m6 j, _% n
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);1 K6 o- B$ x  R% v
  32.         printf("to me:%s\n",recvBuf);6 R; C$ c; Y# C" ^+ v8 H( ]+ C
  33.         memset(recvBuf, 0, 100);. o1 j/ G: v; {! P* B% N% A9 F
  34.     }
    6 e" z* X& U2 L9 n3 K6 K
  35.     closesocket(sockClient);: p; u: r* }% x: s: I+ p- j
  36.     system("pause");3 ]1 v' d+ J  q# v  d8 Y
  37.     return 0;# _9 O5 {( [, P; S3 q6 j
  38. }
复制代码
客户端代码:  J$ }& \; h$ [, q& c
  1. #include<winsock2.h>
    " K* ]8 p1 j' D4 M# k
  2. #include<stdio.h>
    ( D2 q8 W( }: y6 r; e( D' ]4 n' l
  3. #pragma comment(lib, "ws2_32.lib")$ b( y8 D& C  I6 {  P1 m8 t
  4. void main()
    ; {' ^7 h1 E2 Q8 e+ O: a
  5. {
    0 s) _3 c; W2 i! |- k
  6.     WSADATA wsaData;2 f$ |2 Z7 ]9 p" w, ~4 K* W2 ?  I
  7.     SOCKET sockClient;//客户端Socket9 \: q5 }; ^3 [$ f8 V3 N  m1 u
  8.     SOCKADDR_IN addrServer;//服务端地址2 K( I' |9 S( v! D9 ?$ |& m8 x
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    ; |; k  D7 a! Q: u
  10.     char message[20] = "HelloSocket!";+ ?4 ~. o3 I+ X+ B+ M/ h
  11.     //定义要连接的服务端地址/ @1 u5 j. z: k: m1 @* `' m1 s
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)) @6 p7 r% x  w
  13.     addrServer.sin_family = AF_INET;
    8 W* @  l+ }- J0 ^' ?
  14.     addrServer.sin_port = htons(6000);//连接端口6000. \# |0 H! y: O) v
  15.     //新建客户端socket
    3 ]! y) `; }+ ~3 a
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    % V1 Y, E6 S* b6 U1 {
  17.     int s = 0;
    * B3 r" I' ~6 M/ `1 a9 p
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    & ~9 ]7 y7 ?+ ^  ?1 R

  19. 8 w( {& D/ m# R
  20.     while (1){
    ' d9 `$ @8 n4 ~' {. {$ R4 h8 Z" I
  21.         //发送数据& @2 O+ l  A# H/ x2 \8 a# ]: k7 M
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    ! H9 u! Q6 R( s1 j% Q
  23.         printf("to server:");- q# r+ r' M( e8 H
  24.         scanf("%s", message);3 b' Y0 P4 l0 J7 N% Z6 ]2 r
  25. + `* t3 n( A* r" x3 [5 h1 Q
  26.     }
      U/ Z* d: o0 H/ t6 g
  27.     //关闭socket9 c, S% _" R1 v' q( o' C% S5 D5 Z: t
  28.     closesocket(sockClient);
    + ?6 n  A4 h5 a0 Q
  29.     WSACleanup();
    9 ?+ G( n6 ?4 [- R3 L
  30. }
复制代码
求懂的高手来解答一下。' L  Q3 w3 G+ l& e7 Y( [! E
谢谢了!
& U+ \' J5 d) H1 K& \. i% _" U! X
( L) [3 {, o! B( X$ G( B

. y# L8 t# g9 x) c, e% ^2 `& E7 p  S: M8 r

作者: admin    时间: 2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者: admin    时间: 2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
; D" V. ^5 }1 ~+ Z  T% x6 irecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了




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