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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

大家好,感谢你的回复。6 R1 }; n' P3 i& O$ e
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。, ~% O: a' m; T5 v) f: _+ Z2 c
Talk is cheak , show me the code.
1 l. K9 }, W! a% U服务端代码:
1 k% S$ o+ M2 i. }( V
  1. #include<stdlib.h>$ [& Z- h3 P) ]. F2 `
  2. #include<WinSock2.h>/ G: Y( z/ |0 h/ w3 }
  3. #pragma comment(lib,"ws2_32.lib")
    % a% ~4 e9 r+ f1 g8 n
  4. int main(){
    : ~, i# _% U& d$ _1 H* W1 _
  5.     WSADATA wsd;
    ; e0 n( V- ~( k3 N. j
  6.     SOCKET sockServer;9 S8 S6 E  @0 x6 f
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    9 L" @3 J1 B. i/ i
  8.     SOCKET sockClient;. Z0 \$ Q* |) y$ V7 v: C
  9.     SOCKADDR_IN clientaddr;& Q! [) f5 M3 g# {
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    7 `4 j, g6 e" ^( t; O$ K
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    % W0 v" s/ p- Z! D. h+ b* ]

  12. 6 L) {: q' R) l# e9 A
  13. 2 h* i# C: U& ^
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    % H* I: b/ g# Q) X) H% B; A& t* F
  15.         printf("Socket has been created :%d", sockServer);
    6 R0 @1 L# F. \9 U% H
  16.     }
    7 t# n2 J8 b! M7 L1 D  G
  17.     else{
    1 ?; {5 ~1 A3 I0 v5 c
  18.         printf("Socket create failed.");
    : o) N2 X3 v+ |% I0 ?! Z
  19.         exit(0);6 h" ~: \9 m! \6 {
  20.     }- `; V$ T5 S& i& i/ X! K6 V
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);5 ^. d. l6 @; z5 g% F) E3 U
  22.     serveraddr.sin_family = AF_INET;5 @  ~1 B0 n3 A( X
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    / B& G. j; ]( |& z
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    ( {, Z. v5 ?9 l# q0 l) n
  25.     char recvBuf[100];6 l7 X8 I( Q" _
  26.     int len = sizeof(SOCKADDR);
    6 C6 J% f4 O* d! Y* l2 E
  27.     listen(sockServer, 5);//5为等待连接数
    ; s8 N4 j4 ?/ |* i2 X  N% @
  28.     while (1){/ Z. [5 R6 P" h/ r* t* ^
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    9 G. i3 A' u0 x4 ]. e& q: P
  30.         //接收客户端数据( o/ s- I; Y* Y
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);6 j2 s. o7 D" t8 E
  32.         printf("to me:%s\n",recvBuf);( l2 o8 x- V( I0 h0 H
  33.         memset(recvBuf, 0, 100);$ j( V; M" w  E: \% D4 K: s
  34.     }
    8 C! i0 s( ]0 K1 ?4 i
  35.     closesocket(sockClient);
    ! T8 f- s+ t( x* [2 Q7 \* i0 ^5 H9 ?
  36.     system("pause");
    " T+ \8 J9 S, W' J2 B" v
  37.     return 0;/ K! [' q4 i$ x1 e1 ^
  38. }
复制代码
客户端代码:* A$ I; j# p6 k: s' [- c6 i
  1. #include<winsock2.h>
    / q" Z- ^7 w4 d8 `! t
  2. #include<stdio.h>" K. [: e- W; N6 {" i7 H) G2 e
  3. #pragma comment(lib, "ws2_32.lib")# q7 C- v4 i; ]  D. m+ F# t
  4. void main()3 y! A2 L7 s' w7 r4 ^% U; l* ^! b
  5. {
    6 }* |, n; q4 U" w) H
  6.     WSADATA wsaData;
    6 E0 n# e" d' c8 D( w  v
  7.     SOCKET sockClient;//客户端Socket( R7 M% `" o: N: ^$ m; H# g; ]
  8.     SOCKADDR_IN addrServer;//服务端地址
    $ k" K( k: b  p2 B  N
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);  I1 V2 |& c3 ]9 T
  10.     char message[20] = "HelloSocket!";
    - f, @  @. o' q# s: L, B$ ?. w
  11.     //定义要连接的服务端地址
    & X1 m' {3 Q, f9 h' Y
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)% S# Y6 {$ D, n4 U' o7 @# R% p
  13.     addrServer.sin_family = AF_INET;( J/ X  N- z, C: f: I
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    + ~4 e2 {9 c; o. d
  15.     //新建客户端socket
    8 b: g2 Z8 {9 ]5 c# R  |
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);( y0 e$ J5 Y7 E( _" h- I
  17.     int s = 0;
    . T5 @$ J- ^8 I+ d9 L
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));: J+ g- O: e7 y6 z0 L5 q
  19. 8 V1 X1 J- K4 f! |" W
  20.     while (1){& Y' b* B3 K2 w, p/ _
  21.         //发送数据, S. I. a; j  Q8 v
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    : w6 W2 m6 x; q/ p! V3 b
  23.         printf("to server:");
    / \3 f6 S9 T) }6 K# k0 [8 v
  24.         scanf("%s", message);
    : G$ ^+ p/ W9 |. z

  25. 9 M$ d1 ?& [/ L, C& f
  26.     }* G1 ^7 g. e  M# Z- {4 P% }
  27.     //关闭socket1 M# Y! u6 `2 F) N
  28.     closesocket(sockClient);
    2 M0 h# a4 M) A2 e: r: L; @
  29.     WSACleanup();3 `9 P1 Z# a0 `" q/ `4 n  }
  30. }
复制代码
求懂的高手来解答一下。
9 B& ^. S/ q) L0 Q+ o2 x; e: \谢谢了!
5 x& [9 Q3 ~- \5 M5 p' v
7 Y2 O3 R$ A: W4 }$ B! P

1 Z7 R4 ^% ~7 _2 ]' V
% Q4 R4 s" M5 |

最新评论

admin 发表于 2020-5-9 02:33:06
应该用多线程或者多进程,,,过两天给你源代码
admin 发表于 2020-5-9 02:33:20
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为' o. h6 g( q& [) x1 ]5 n% v" U2 d5 C
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了

GMT+8, 2023-9-23 02:18 , Processed in 0.131902 second(s), 21 queries .

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