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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

大家好,感谢你的回复。
; B$ I, m: z0 i5 S. M" ]2 _我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
4 g5 m* v" `: b% T$ F9 z. CTalk is cheak , show me the code.' Y# B- W/ D3 n/ {
服务端代码:
9 T" g* j/ e' W, m1 P" L+ Q/ n6 O1 n
  1. #include<stdlib.h>4 L# N  j+ @2 d: X) C
  2. #include<WinSock2.h>- @) A4 V' o( H
  3. #pragma comment(lib,"ws2_32.lib")
    ! J! ~; B) c+ n& B8 ^  U& p
  4. int main(){
    " P) }( R/ B' ^4 Q# f/ K
  5.     WSADATA wsd;; Y9 u* I9 D8 Y8 M% ?1 W7 g
  6.     SOCKET sockServer;) R* x/ m# \8 r3 e  e
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    7 T1 U- ^1 y/ A" [6 S" q
  8.     SOCKET sockClient;, k) H4 H9 |& B* `, s4 U2 [9 G$ ]
  9.     SOCKADDR_IN clientaddr;9 T4 g7 D4 c2 m  a7 d
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    5 t# W! u' W% z
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    ! }2 p& L& D1 K" [5 j
  12. . W6 ]. l# H- m" m6 m7 v$ s" T
  13. % e2 X' v+ \+ x! }! a6 x, s& G
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    / _4 g. p) z8 i( }
  15.         printf("Socket has been created :%d", sockServer);
    , ^( b" a+ q& ?* B# _
  16.     }
    % m$ m3 k" V0 p$ b" Y
  17.     else{
    # k9 m/ Z" g! J! @
  18.         printf("Socket create failed.");
    ( A1 ~: L$ I0 h" y
  19.         exit(0);3 O! s8 F  P5 I. Q  h6 J
  20.     }
    * E3 q' i% E8 W
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    7 s1 _2 k$ o5 r3 E3 y+ ~
  22.     serveraddr.sin_family = AF_INET;
    ) t- o) s( P. F) G
  23.     serveraddr.sin_port = htons(6000);//绑定端口60009 |  @% `4 G# I
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));5 C! w: U. l8 d) ]6 {2 `1 ~! l
  25.     char recvBuf[100];
    ' E! M1 S3 f9 q7 h5 N
  26.     int len = sizeof(SOCKADDR);
    ) _) i$ n8 _, S: q9 R" K+ @2 h  f
  27.     listen(sockServer, 5);//5为等待连接数7 w- P3 C' K2 {' b' K0 N4 D# S
  28.     while (1){
    ) D3 q& D9 I* j
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);" }( i7 p5 B4 l- K1 N3 [
  30.         //接收客户端数据# k3 V: @( M; {0 k& b
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);# W3 A% _( Y1 G8 B. C# i1 y6 q
  32.         printf("to me:%s\n",recvBuf);6 J* e% w& `. I" ?+ f
  33.         memset(recvBuf, 0, 100);4 o1 q; N8 i. W/ ?, ^( e
  34.     }
    5 j! {5 ]1 ~, F* Q! T
  35.     closesocket(sockClient);! J- M8 m( q7 P) a0 a; O
  36.     system("pause");3 f: V! f# w; `0 e5 v
  37.     return 0;( p: q6 w+ ~  J+ k  f" }8 T. t
  38. }
复制代码
客户端代码:  E$ ~! w9 Z2 T0 U( d; E
  1. #include<winsock2.h>
    # |+ b( C" v" [
  2. #include<stdio.h>
    " n, G- C& f3 k9 {% p/ m
  3. #pragma comment(lib, "ws2_32.lib")
    1 p; g+ g- S6 Z8 E
  4. void main()
    / J6 `3 J7 |# ]% w5 I1 d, p
  5. {5 y3 S' l" w: |
  6.     WSADATA wsaData;1 ?/ D4 B; ?& q" ~6 Z
  7.     SOCKET sockClient;//客户端Socket
    : }/ w3 X% ~2 |7 h; t# l3 r* H, L
  8.     SOCKADDR_IN addrServer;//服务端地址( s4 o4 b: h4 T7 B, a
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    ; i) \* u5 R* ~. i+ S3 F* z
  10.     char message[20] = "HelloSocket!";  @4 x# [9 _+ [2 E
  11.     //定义要连接的服务端地址
    1 g3 {, _" ]0 {% I
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)/ e7 J* m# Q# M* W
  13.     addrServer.sin_family = AF_INET;0 G  l* w  N# |, \
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    % p" p/ \; E1 G: Y
  15.     //新建客户端socket
    # n0 _& i- }  e- O' D8 I
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);: W0 U2 B1 k6 o" S0 g3 g7 ]1 a
  17.     int s = 0;. E+ Z! e: d; K  y
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    8 m! I  R- P+ T3 V+ v/ B' _& b  p

  19. 2 J: F( O' }* z4 [5 }0 q
  20.     while (1){
    & S! l6 O7 G6 ]* Z5 C1 n
  21.         //发送数据4 Q6 R3 A) J' [, S' g; A/ E
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);# E4 a5 ^2 x; I5 ?  x! Y
  23.         printf("to server:");9 K" q# m* m/ m$ p( G. K/ B& i5 X1 _5 n
  24.         scanf("%s", message);% G, A% r  @4 O% u

  25. ) T3 }& [' X+ @& i+ x( d
  26.     }
    ) m# P, J" r4 I: L7 P
  27.     //关闭socket) ?. x# I# L5 l+ F$ m. a- `$ X5 {0 m  R
  28.     closesocket(sockClient);
    " x7 |" D* x! n
  29.     WSACleanup();
    2 F  m3 Q4 m: p
  30. }
复制代码
求懂的高手来解答一下。
- o* N; Z7 X7 |" N: B谢谢了!
& z$ J* F) s2 H! v8 k

8 E: A& G' T  l: g/ l% |% P  l# z* ~* [! b) N3 v, y
# k! Y" p4 Q9 X( }

最新评论

admin 发表于 2020-5-9 02:33:06
应该用多线程或者多进程,,,过两天给你源代码
admin 发表于 2020-5-9 02:33:20
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为" L* o# \! d9 i" O! h- @
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了

GMT+8, 2026-3-16 15:22 , Processed in 0.056331 second(s), 18 queries .

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