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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 11631|回复: 2
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。# S/ G$ [8 y4 k: o6 `/ t$ ?. L  z
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。; R+ q$ y  V9 ?) |
Talk is cheak , show me the code.4 j& U' q' h( N& f( a8 Q
服务端代码:# t. f8 m$ n6 f6 U: V9 f8 }
  1. #include<stdlib.h>- H2 m0 t/ H8 O0 K4 y& a
  2. #include<WinSock2.h>0 {, j2 w& Y2 ~, X
  3. #pragma comment(lib,"ws2_32.lib")
    # ^( U+ d' O7 U, Y# p" ]( K
  4. int main(){) b; v& F/ W) U' y- |
  5.     WSADATA wsd;
    8 H5 q* |0 X& ~& E( M6 q
  6.     SOCKET sockServer;
    " `8 N7 \& i1 W( Z+ ^
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    " Z, p0 y  P5 o5 f& G" ?9 y0 R
  8.     SOCKET sockClient;7 a) S! \* h: j. c
  9.     SOCKADDR_IN clientaddr;& u. C; l2 h0 I
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口$ p' c2 U  D- J
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    " i' N# E5 c: I, n) @/ a

  12. * X! A, O. [. U* L- w$ U
  13. $ Y" M; V8 H, K+ b9 A$ B0 \
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    1 o- ^$ b* _. o( N/ f" J3 d" j
  15.         printf("Socket has been created :%d", sockServer);( Q+ l9 i4 U. h8 ~, r
  16.     }
    ; j$ l: m2 d. F' `
  17.     else{1 Y- B! A& s# z: H
  18.         printf("Socket create failed.");' N: t2 f0 R2 H8 D( b- G
  19.         exit(0);
    ) J$ H; {4 X+ Y5 M& t8 C
  20.     }
    & P; q3 q" W# P# x5 i3 A+ S
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    * D4 S0 _+ Y7 ?& w8 l3 c7 [
  22.     serveraddr.sin_family = AF_INET;
    8 s! H8 \9 b1 j
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    / M: M% @) g: F0 E
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    : D  I3 D: s; f
  25.     char recvBuf[100];
    9 Y8 s9 G5 w9 ~" \% T4 E
  26.     int len = sizeof(SOCKADDR);
    + u- \- u- j8 O) s+ M6 g4 `
  27.     listen(sockServer, 5);//5为等待连接数
    " f% D4 f7 C/ W7 G7 n6 K
  28.     while (1){; h( N* J# K+ _+ ^1 M
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    - R2 V5 x, i9 T) S9 P, @0 w
  30.         //接收客户端数据3 b$ |0 w: S) x, P* E+ \! B
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    & I- a6 n& E) x6 m8 ^$ F* c
  32.         printf("to me:%s\n",recvBuf);
    . J( |2 C# |% N3 P& i3 S; m; v9 ?
  33.         memset(recvBuf, 0, 100);
    $ e3 E- F+ \0 e- }' R
  34.     }
    ) l9 Y$ P! H' m6 G. f4 M
  35.     closesocket(sockClient);
    ( J# K4 o: v! N( d- H. ~( \
  36.     system("pause");4 C+ }* ]9 z% H& T
  37.     return 0;9 J* t4 i1 @) d/ W
  38. }
复制代码
客户端代码:
  x: V% z3 ]5 _  D
  1. #include<winsock2.h>
    5 Y3 @. j$ M& X  ]
  2. #include<stdio.h>8 W2 |5 e( c5 }' i2 M. ~8 [
  3. #pragma comment(lib, "ws2_32.lib")0 B' \( k% A# i. ?* O: _6 w
  4. void main()
    / A0 ]: q/ R. ~/ y
  5. {
    + D5 a: j; L: x! @: ~
  6.     WSADATA wsaData;
    & s( T) J( X6 U% O/ s4 j
  7.     SOCKET sockClient;//客户端Socket
    7 u( R) E! b5 W4 U
  8.     SOCKADDR_IN addrServer;//服务端地址2 S* Y$ \0 V3 ^: K+ \
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    $ Z9 {6 @7 s8 L* x
  10.     char message[20] = "HelloSocket!";
    ; S6 y2 {' H1 l. ^
  11.     //定义要连接的服务端地址: z) d2 ]2 o  m9 ~0 j9 z! Z5 j
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    7 j% u- x4 u9 v" S! [* R
  13.     addrServer.sin_family = AF_INET;3 z& x4 V4 j* a
  14.     addrServer.sin_port = htons(6000);//连接端口6000$ |! \7 r! a. a* f1 Y
  15.     //新建客户端socket
    : n4 i) E- m$ E2 D* Z
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    . s; k: I# k% |, N- R
  17.     int s = 0;
    " |3 W, y' o8 ]' e
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    : ]! @6 z' b6 o
  19. % L* b/ R) U/ C: j$ ^
  20.     while (1){
    # {: p7 U" Z% M) r# @
  21.         //发送数据" ^' H: N# d5 c" G) X+ ]
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    ; E2 r1 [. |0 R$ X/ M
  23.         printf("to server:");
    ; [! a( _8 e% A
  24.         scanf("%s", message);
    0 L5 w6 f/ D' |: i

  25. " u! B/ q! h: }
  26.     }
    ' b$ T' b- E1 E7 G
  27.     //关闭socket/ J5 L3 o: l  h1 m+ ~
  28.     closesocket(sockClient);  O, [/ M/ V3 B) `3 {* X
  29.     WSACleanup();9 j3 {' z9 L6 w6 i, @3 _
  30. }
复制代码
求懂的高手来解答一下。
1 D  G) u% l# e$ @谢谢了!
5 ~  b- D2 v. ~! C/ g" U

( S5 K  C$ n" U# ?% t1 Z3 w- m! K, Z8 H: G
" w$ N9 x; ?" X% ~/ W. f8 F
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为* `/ o8 Z  |! a8 Z+ q! h
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-9-29 04:54 , Processed in 0.123760 second(s), 21 queries .

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