cncml手绘网

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

作者: admin    时间: 2020-5-9 02:32
标题: C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。2 o5 B3 W: m! T
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。0 t5 f/ S. t' U! b
Talk is cheak , show me the code.+ D( N' v) x9 J( {3 t$ A
服务端代码:& I% V* @$ [( i3 |
  1. #include<stdlib.h>, C1 H$ X- U- s0 V
  2. #include<WinSock2.h>; ]3 R% n; w+ @% @7 T
  3. #pragma comment(lib,"ws2_32.lib")
      M& {6 ~& n9 K6 _
  4. int main(){9 s$ m' r& @% t; o! t$ H# m( g) b
  5.     WSADATA wsd;
    $ D2 \2 |, A* P! B1 X
  6.     SOCKET sockServer;1 x* Y( V5 S: u" f# N1 A$ w; R) M* U! G, Z
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号6 h, ]9 n2 j0 Z" Q
  8.     SOCKET sockClient;4 @& ]+ y: M0 I9 w9 I5 A: r3 z  H
  9.     SOCKADDR_IN clientaddr;, `! e4 g3 w# R
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    6 L, n3 X" V7 w! c8 g
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    2 G, @4 F' }2 `1 I3 I: A, l- P
  12. $ [* r6 g! b3 i' O
  13. * C2 u' ^- k7 J( r' `
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    $ N1 z5 F. x5 r& F
  15.         printf("Socket has been created :%d", sockServer);
    * ^+ t, Q# u0 v( r
  16.     }
    , ?/ L" A- i( b3 ~* U0 h! f2 W- t
  17.     else{
    2 d: j  F8 j/ h
  18.         printf("Socket create failed.");7 N2 ^7 Q5 S8 A$ d
  19.         exit(0);9 E# x( X' e- y- ^5 H
  20.     }
    4 ~, w0 f1 b  r+ _7 w* @9 H) s
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);7 U5 k+ L- A5 [0 i; Z" t% {
  22.     serveraddr.sin_family = AF_INET;
    ' K; I# h5 Z3 |: j. X7 W  l
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    ' x  ^- [6 }5 ?6 P9 j
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    & |# R2 \- D' E% `4 Z" W  [& L
  25.     char recvBuf[100];, O' w0 G" U; V( t- F
  26.     int len = sizeof(SOCKADDR);) Q2 x+ b$ \: s1 j5 u+ S2 e$ b
  27.     listen(sockServer, 5);//5为等待连接数
    9 n# e8 |( u+ ?8 T
  28.     while (1){6 J* \+ r$ d$ T4 i: p! h
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    / P2 u& C8 q6 b4 N2 u% ?0 e: O: E
  30.         //接收客户端数据
    1 J8 j9 T( Q1 `- y) k" e: m+ U) Y
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);% L4 i1 l+ ?, i& N" Z8 Y
  32.         printf("to me:%s\n",recvBuf);
    ( h/ e( L% t5 W9 d: ~
  33.         memset(recvBuf, 0, 100);
    & ~3 j+ B4 E: f0 y( N6 q: q
  34.     }, g$ k1 e# b9 ^8 O. c2 U
  35.     closesocket(sockClient);& M8 z3 X+ J9 M8 [' a' D5 T
  36.     system("pause");
    7 v/ `8 h5 ]" I
  37.     return 0;
    + a% w2 f4 G' g& W( t$ W# y
  38. }
复制代码
客户端代码:
. D7 x% d: V7 W, ?% d9 M; q
  1. #include<winsock2.h>, @& d3 P2 F6 i8 w8 \
  2. #include<stdio.h>9 [: z* E* ?1 E4 I, _. r
  3. #pragma comment(lib, "ws2_32.lib"); Z- k3 R  H: Q) L. O
  4. void main()
    1 K: N) Z- m7 M. j! Q9 y4 I: Y
  5. {; Q" A( p* q+ P$ T+ c1 \# T
  6.     WSADATA wsaData;
    1 t- p: C* W. {8 P8 b& }
  7.     SOCKET sockClient;//客户端Socket) i, K$ c# x( F! G
  8.     SOCKADDR_IN addrServer;//服务端地址8 c6 ?" I7 o2 k, ~- x+ H- _# ]' f
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);9 e  d! g4 a: d  D4 P
  10.     char message[20] = "HelloSocket!";6 T! A0 F0 |$ z- o. t0 f9 F
  11.     //定义要连接的服务端地址* U. p2 G7 a0 E  S- |2 {
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    : r$ z7 }. b, Y2 s$ ]% c
  13.     addrServer.sin_family = AF_INET;
    " ]* K0 O5 v, @" a
  14.     addrServer.sin_port = htons(6000);//连接端口60002 Z+ \- L& T9 x0 Y! R; `
  15.     //新建客户端socket. m; l, H# W* `* Q. w& ^5 E1 }
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    3 P' ?# L) U8 b# w+ L6 H
  17.     int s = 0;
    * o5 T0 a" s" a: x: K1 k
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    , E/ p1 q8 N' {  [6 m9 i6 @( D

  19. 2 j  |: t+ {! A! I1 x+ q$ p4 v+ {
  20.     while (1){; T+ p. }$ [# K9 H3 Y" A1 ^' K4 ?
  21.         //发送数据
    ' R5 _6 M: C4 a& f; u+ P
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);6 ~2 [; J8 U& p5 I$ i% _2 Q8 ~
  23.         printf("to server:");
    . V% \0 I3 r  o6 I# \5 Y
  24.         scanf("%s", message);
    0 E" w' x) B. Y: b+ W
  25. " V0 n2 F$ P6 P# ~1 D
  26.     }2 G4 e: v. n) @+ m0 t8 w
  27.     //关闭socket. v3 F, v/ h2 K( }/ v
  28.     closesocket(sockClient);
    ; }3 K2 c0 ]: q
  29.     WSACleanup();# r* y& {: Z$ r& T2 G2 b1 Z
  30. }
复制代码
求懂的高手来解答一下。
* C/ n! J# J7 q% a谢谢了!
1 E: \7 L  L: R8 S1 u
2 X7 J! I2 L* I6 {

2 }4 _* k# b& L. E  o( ]1 A' H1 z8 N0 a

作者: admin    时间: 2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者: admin    时间: 2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为" p$ S; E/ \) R3 D8 h1 _
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了




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