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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。& m1 x  `8 O  i' B0 k8 o
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
1 m5 t! \+ W/ GTalk is cheak , show me the code.
1 z0 S) {; p2 T* I! o* e服务端代码:
0 [6 w  s8 \1 M: D/ i7 z
  1. #include<stdlib.h>" f' @9 i2 u8 M% _% T+ x# ]$ @
  2. #include<WinSock2.h>
    6 N( t0 F) U6 z) J: U) H% A
  3. #pragma comment(lib,"ws2_32.lib")
    4 }6 C3 d3 b: [
  4. int main(){( h( S: }7 {2 ^. P0 U8 u- i
  5.     WSADATA wsd;/ H9 k% V. f! ~' q3 s7 m# S
  6.     SOCKET sockServer;. F* _2 I, U. w8 u, h2 s5 ?
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号8 M. l2 n, E3 |0 A  t& k
  8.     SOCKET sockClient;
    * ~8 n0 |- Y9 E. F; j
  9.     SOCKADDR_IN clientaddr;
    : R5 ?6 Y  z1 ^9 H9 q
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    & S/ V) a* I, l; f# K6 R2 Y
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket) e: t/ k& z  k1 q: T3 k

  12. / h- ?6 f5 ~+ N; U6 }- ]
  13. 7 t9 `& y) T+ }9 O8 c% p1 b
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){) [0 k; E3 E2 L0 W4 b; p
  15.         printf("Socket has been created :%d", sockServer);, p6 X4 ^- B& J( d" T( k( U/ r
  16.     }6 T3 q( Q/ ^* b2 d- `* N& b
  17.     else{
    / R/ \& ]2 V5 K& u! W; x$ V. v
  18.         printf("Socket create failed.");2 ^! W2 e" g! P" z# f
  19.         exit(0);6 R: i8 M: i8 T+ z4 f0 O
  20.     }4 V9 j' Q4 z3 M/ e! W2 m! O. K4 J
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    2 L# h. A+ f0 r8 a3 i, _3 h
  22.     serveraddr.sin_family = AF_INET;
    $ V" |) j- j4 n$ z) A3 o& W" D$ y. `
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    + X# f) p, F$ Y
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));8 u! k7 k$ Y6 b2 D8 j/ k
  25.     char recvBuf[100];
    # B, J2 E; M3 `, `
  26.     int len = sizeof(SOCKADDR);
    & W% `, I/ ^6 Z% P. k
  27.     listen(sockServer, 5);//5为等待连接数  f1 c* K9 n2 U; n1 z+ _& i
  28.     while (1){! }6 \& T1 U: T4 C9 K
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    ; r8 r% M* H2 F; ~7 k8 X3 g
  30.         //接收客户端数据
    ( _+ o( a  Y+ H
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    8 e* O3 \5 _- U. r: W0 P2 p
  32.         printf("to me:%s\n",recvBuf);: @; w5 L$ q5 I% ^6 Q
  33.         memset(recvBuf, 0, 100);
      W1 ?: O5 v4 o3 f$ T
  34.     }
    7 l" Y' w) L5 W/ ^# U* {7 t) Q
  35.     closesocket(sockClient);+ F. R4 L, t) L6 J
  36.     system("pause");
    : T; A5 x+ ]2 d" E4 e7 S5 |1 Q5 D, I
  37.     return 0;
    # ~& w" m$ s( N3 Y+ i6 g
  38. }
复制代码
客户端代码:- P: y/ S. A% n. O2 Y! Y
  1. #include<winsock2.h>; D/ s) ]5 W3 }6 G# ]
  2. #include<stdio.h>
    1 f! r' t8 B) A# [1 W
  3. #pragma comment(lib, "ws2_32.lib"). ?) w8 ], m) M* _* F& @, T+ c
  4. void main()
    # E( b$ a0 Y$ b1 q! S
  5. {
    - r7 c" r* G4 n: _8 I' \7 g! _: t
  6.     WSADATA wsaData;' |8 ~9 M+ Y- X. ]6 w
  7.     SOCKET sockClient;//客户端Socket, E, C- \1 _$ V
  8.     SOCKADDR_IN addrServer;//服务端地址, ~) ~) ]1 P$ d4 j( R) J+ R8 l
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    + a5 b: u3 c1 O& E
  10.     char message[20] = "HelloSocket!";3 k2 B1 ?4 q9 `
  11.     //定义要连接的服务端地址) z# |( E0 k6 l2 B- a
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    4 l$ @8 ~/ I! K& U' _7 @) e
  13.     addrServer.sin_family = AF_INET;4 ]- D$ d2 |+ O
  14.     addrServer.sin_port = htons(6000);//连接端口60005 Q6 U- ^# y' Q9 I( X+ a) M
  15.     //新建客户端socket
    % _# V4 R3 u5 s# @, N- }: D
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);5 W7 I. z) v5 S/ `0 U+ C
  17.     int s = 0;& {& q( r& P% O3 ~
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    ! I: q) p" Z9 I# i
  19. - |! y  f; ?) y. \$ C$ @
  20.     while (1){
    4 W0 C! p8 z! ]
  21.         //发送数据  L: C! A: p' `
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);# w2 h/ u4 L! T) i
  23.         printf("to server:");8 G- F; R2 g& U  |7 B
  24.         scanf("%s", message);
    & Z4 \( F# N1 |! V4 c% O

  25. $ ~; h* h; ?5 n, l- o9 n& Q
  26.     }# Y: b0 q7 X. |4 G+ h
  27.     //关闭socket
    " g' L3 _# }0 D, ^' r# O0 R* Q
  28.     closesocket(sockClient);
    " f0 v. w9 f* p
  29.     WSACleanup();
    6 W; J! E( U/ ], W8 F
  30. }
复制代码
求懂的高手来解答一下。
8 [. i, x1 a. \4 J. P% B谢谢了!+ G% c. h% a9 J! }+ u$ \- K

1 q% D2 W5 D6 P; @3 t! i% j7 z2 T) b0 F9 }1 v
6 A. Z+ N2 R, Y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
' |" j6 r# ~2 l; b, B" drecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2024-12-22 10:01 , Processed in 0.099002 second(s), 19 queries .

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