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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

发布者: admin | 发布时间: 2020-5-9 02:32| 查看数: 2903| 评论数: 2|帖子模式

大家好,感谢你的回复。
6 H, D% a+ A: l) {' [我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
6 R0 M$ R6 ?6 b7 K( c! V0 JTalk is cheak , show me the code.
! t8 e7 h1 _, B8 N+ ~服务端代码:* e& Y8 C# l5 u  g; E0 f0 i
  1. #include<stdlib.h>( t9 ?) m; {3 u
  2. #include<WinSock2.h>
    6 n% T8 }% M" w
  3. #pragma comment(lib,"ws2_32.lib"). x: f: e/ O7 g
  4. int main(){
    ( @' U" p  |  S8 _( N8 x1 ~
  5.     WSADATA wsd;
    + Y4 _. j! K9 C2 k% x
  6.     SOCKET sockServer;
    * H6 c! R. {6 M9 |
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    # j" f# I4 I- q) E! p
  8.     SOCKET sockClient;
    * H! q5 h- M6 u* {, b4 k9 C8 [
  9.     SOCKADDR_IN clientaddr;
    * L9 ?# l' a6 j0 |
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    # r- {1 e$ z) ?) ^* F# q+ [
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    & m- G5 H9 @. c$ x) a+ |6 i/ o& p* c

  12. 3 z5 E8 o, v& j" a9 {3 F. p. n1 j
  13. 3 m( r! V8 p( r. {
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    * g) C$ G( z0 ?! Z) ^
  15.         printf("Socket has been created :%d", sockServer);/ {1 e6 O2 ?. @) o7 d1 Y
  16.     }3 o' ]. W& R: _7 I$ U7 @4 [* |
  17.     else{- m  c/ m) ~* y5 U' j* P
  18.         printf("Socket create failed.");
    ! S$ X+ t2 r, f. y
  19.         exit(0);
    , H) K+ j/ w; a) f( ^0 x
  20.     }' F4 u" p7 I; q0 I- _
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    " |# J! a# j0 y; U6 c+ |7 d
  22.     serveraddr.sin_family = AF_INET;; @3 N, f& u. F3 K1 X0 ~3 y
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000% h$ D7 v, J+ j& k: {/ n5 p
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    / A  Z' a& e& C# d8 c
  25.     char recvBuf[100];/ S% ]* l# V1 D8 v( ]% i; ~4 S& l
  26.     int len = sizeof(SOCKADDR);% ?2 m2 f' S! l2 |) m
  27.     listen(sockServer, 5);//5为等待连接数; k7 |0 E- O$ b& w9 U
  28.     while (1){
    * P7 T, ~6 r$ p/ h9 g+ X
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    " G/ d! k5 A5 v& G4 g- c
  30.         //接收客户端数据3 O" A# Z1 j9 t
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    ; A; |7 c) }) l$ D
  32.         printf("to me:%s\n",recvBuf);& M. Y% b# B+ E/ S, N
  33.         memset(recvBuf, 0, 100);3 T8 M  K  Z$ S5 d7 m5 P  n- ~$ w
  34.     }3 J) N' e! K4 X  y- d* N0 u9 k
  35.     closesocket(sockClient);! }" o: l; a2 h- d- z; S
  36.     system("pause");! N; x5 g- f' r4 P0 V; I
  37.     return 0;/ t! ]3 G; Q/ _
  38. }
复制代码
客户端代码:, \  U. `- _) b4 C
  1. #include<winsock2.h>
    - Y% C- m* e2 k) z. D7 V
  2. #include<stdio.h>
    0 }2 Z% |& E$ c
  3. #pragma comment(lib, "ws2_32.lib")( q6 n6 I$ P3 y1 [; G+ A
  4. void main()
    8 R( Y. q% j$ S- j/ ^
  5. {4 Q0 ^% @8 M: X4 o) c
  6.     WSADATA wsaData;
    2 r# r9 g5 |/ l( Q# k3 Q) M0 a4 G
  7.     SOCKET sockClient;//客户端Socket
    - H$ a. t. V0 U( V* w7 I, x8 O
  8.     SOCKADDR_IN addrServer;//服务端地址
    : \8 U& _, q* b' ^) W* T0 {
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);; d3 f- a+ C: A; s! V- P
  10.     char message[20] = "HelloSocket!";; z# [6 {: w* t, e# c! }
  11.     //定义要连接的服务端地址
    ' E) D1 r9 \: }' c+ `3 _/ j% E) P
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    7 m$ v6 v2 a9 P8 {( Q
  13.     addrServer.sin_family = AF_INET;# l0 E2 ]7 ]9 w7 t
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    . i- i+ t6 ^7 Q) U* o3 t
  15.     //新建客户端socket2 X$ ?, K; V5 T0 v& H8 c
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);. S* }* Z4 K6 W/ ]& m2 L
  17.     int s = 0;
    9 @$ n5 ~8 r- W, l. F5 `: \
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));6 `7 [' |3 i3 v# k  s4 ^2 [2 W
  19. 4 y" g' B' z3 V3 s4 J' Z' M
  20.     while (1){: N2 u8 `  O/ Y) |6 C6 R; a7 S
  21.         //发送数据
    4 c& A: s- c; v
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);! X2 R, \3 G# m8 D; I: K" ?
  23.         printf("to server:");
    1 }6 E3 f4 n* g' s! I
  24.         scanf("%s", message);
    * D! C3 G0 i" r% |

  25. * {/ Z0 A) d" j1 |
  26.     }
    ) t$ S1 h" `! d% v* V
  27.     //关闭socket
    1 L) {2 e, G! g/ Z# Z  V% U& P) B
  28.     closesocket(sockClient);
    5 J9 a7 `4 u. Y7 x, S# c% w
  29.     WSACleanup();0 H* o2 x: D+ e$ F# D& [2 V/ p
  30. }
复制代码
求懂的高手来解答一下。
! g1 W5 h( H) l4 J谢谢了!
# A3 X% e9 G! G/ L6 X) E5 s! v

1 V4 n1 t5 Y) Z, W
- [- O0 o6 |+ a! K) e- e; f% ^7 q
' z3 k3 e6 ^  q  x: \9 ~

最新评论

admin 发表于 2020-5-9 02:33:06
应该用多线程或者多进程,,,过两天给你源代码
admin 发表于 2020-5-9 02:33:20
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
- i% a: s: A4 t7 srecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了

GMT+8, 2021-8-1 12:20 , Processed in 0.179913 second(s), 21 queries .

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