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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

大家好,感谢你的回复。
9 p2 }$ J' L1 \5 K& Z: B我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
% g: e5 K5 U! R/ b8 X' ~( fTalk is cheak , show me the code./ D4 L, g- `4 n5 [. p& g/ |* ]7 w2 t
服务端代码:
/ b' V  {8 G* G( e" d. @% `
  1. #include<stdlib.h>6 ]& x; U# o) J7 a6 B- T
  2. #include<WinSock2.h>
    5 n2 g- I+ i' u( }: a
  3. #pragma comment(lib,"ws2_32.lib")
      W/ L7 z+ ~3 y- ]- n% Z9 V
  4. int main(){8 f- j# a% t3 F8 n0 @/ M
  5.     WSADATA wsd;
    0 p  {% g7 S% f
  6.     SOCKET sockServer;
    1 e4 {! S5 T8 f) G/ z2 `
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    2 `* x9 I( T) ]9 Q& G) h4 x7 N
  8.     SOCKET sockClient;
    5 }+ m# c  c$ v* R4 x9 O3 `
  9.     SOCKADDR_IN clientaddr;5 m$ t: Y/ M; W7 C- v2 t$ i+ b
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    . y: ^1 S1 @# C* L
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket' R' {5 K% s. z3 g! \# R& t+ U" N! h
  12. ; I0 w6 C0 c9 e0 p

  13. # d; Q: B$ u$ ?/ {* o8 N6 l& g
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    * {% ^: J! M9 y- o5 j
  15.         printf("Socket has been created :%d", sockServer);7 |( T: A# Z# p1 V3 z& L" y6 u
  16.     }; L1 c6 S* A" c5 Q7 S+ h+ ~  P# ?
  17.     else{
    5 {3 \8 g3 y( Y0 ~
  18.         printf("Socket create failed.");0 o. n2 U, o: T/ ?' ?4 ^" F
  19.         exit(0);9 M! M# S& K/ X0 x* C' r9 I
  20.     }
    2 f* [: l: E& U8 |( v
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    " N1 y8 V! i2 Y1 W0 Q- e
  22.     serveraddr.sin_family = AF_INET;
    % n, y) y5 G8 q: ~0 i+ `
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000* j$ m8 F+ D" Q# e
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    4 _1 h. ^2 v# `* K4 {
  25.     char recvBuf[100];* Z# U& I; [4 J; ]& L4 Z
  26.     int len = sizeof(SOCKADDR);& l7 n/ V( t: |3 a7 t4 e; H4 a! H
  27.     listen(sockServer, 5);//5为等待连接数
    6 z& A2 ^. p0 n9 h6 U& B( i
  28.     while (1){
    0 N6 t, `, \8 Z! l9 D( g
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);+ C# b$ \* w3 t
  30.         //接收客户端数据
    9 V: W+ g! }' X/ I8 z1 N
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    , J4 ?3 B3 F* T9 b4 q" J
  32.         printf("to me:%s\n",recvBuf);
    ( e+ G" s  b( s! |0 p2 e
  33.         memset(recvBuf, 0, 100);6 C# r+ X& U% I/ z; ?5 ^5 T2 C
  34.     }- L+ |1 n9 C- I& c8 ]/ |2 Q
  35.     closesocket(sockClient);
    % t5 Q$ i* K4 _' p
  36.     system("pause");" K) N* E# d3 p
  37.     return 0;, O* K" g& k9 j9 ]& q6 `, h5 L
  38. }
复制代码
客户端代码:: z0 f6 ~% H0 S, E# A, c9 z( X$ l
  1. #include<winsock2.h>
    9 D7 j: D1 T  m" a
  2. #include<stdio.h>9 k7 C4 m7 m: I) J* |7 p( x
  3. #pragma comment(lib, "ws2_32.lib")
    7 P. t: K  r/ V5 i( ^3 p: e
  4. void main()+ S+ ]* {( r2 I6 I' p  V+ [; h" |
  5. {
    4 f- G9 |) n2 h4 r2 I
  6.     WSADATA wsaData;
    , a3 F" `0 }+ I# g
  7.     SOCKET sockClient;//客户端Socket7 ?6 z& \( k/ t; l
  8.     SOCKADDR_IN addrServer;//服务端地址
    ( n$ d  e( C1 S
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    ) W) [- y. s; M' ~- H/ [4 o$ h
  10.     char message[20] = "HelloSocket!";
    9 b# C5 i% o8 R
  11.     //定义要连接的服务端地址
    9 w% L6 f3 @9 X1 }
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    / y$ P. c* o2 ?* B  ^: r5 E
  13.     addrServer.sin_family = AF_INET;& Q4 g1 e, J* \+ ]- q9 _
  14.     addrServer.sin_port = htons(6000);//连接端口60009 I- R  Q4 Q) r0 w& P8 K' ]
  15.     //新建客户端socket
    ! M8 c5 v* O# g- m/ V0 ], C9 N
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);$ d8 j2 U$ h; `, @& d
  17.     int s = 0;) ]( O3 Z3 S9 |7 B
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));6 n* L) ^$ I, J) o- ^% W

  19. ; r. Q, A% K: O- l% j7 c
  20.     while (1){
      L/ J" N6 y4 b3 ^2 K
  21.         //发送数据
    3 c$ G/ P& I) O* |
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);* @7 w6 M  s% I
  23.         printf("to server:");+ W  `1 S+ W; ?! U7 x# e
  24.         scanf("%s", message);7 |& o3 b* @1 q; [* t
  25. 1 `) {; f1 Y; o8 ], G+ D
  26.     }1 Q' f8 M& Q: O
  27.     //关闭socket8 g6 ~! E+ D9 l
  28.     closesocket(sockClient);
    ( C# y. L2 E4 \# s0 {, W
  29.     WSACleanup();
    ' t7 ~& E8 N  y7 L5 R2 v! n' r
  30. }
复制代码
求懂的高手来解答一下。
7 {: x( a7 M  t! R' V谢谢了!8 |* }' r6 N8 s5 v

$ Z$ @- A9 W3 K( F0 t
8 z9 ?0 Y" N9 P: s
. D6 g5 i: L, a0 w* y. a) S; W6 k

最新评论

admin 发表于 2020-5-9 02:33:06
应该用多线程或者多进程,,,过两天给你源代码
admin 发表于 2020-5-9 02:33:20
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为8 w. \8 U1 B8 y' Q& w
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了

GMT+8, 2026-4-30 19:30 , Processed in 0.060164 second(s), 18 queries .

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