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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。8 _8 h0 a! U' o6 E
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。1 k$ f! R/ {0 J" }' W( L" G, g
Talk is cheak , show me the code.
- T( c% R' y1 x" f8 A' r服务端代码:/ O5 M1 ~. Y5 T/ u1 D8 h  i
  1. #include<stdlib.h>
    9 X: Y! E7 ~( h& h  A
  2. #include<WinSock2.h>
    : V5 G: Z, [. t. W
  3. #pragma comment(lib,"ws2_32.lib")2 ?5 D4 H- w; P/ U! ^
  4. int main(){0 D6 b( q  d; `. y; I6 T4 B1 y
  5.     WSADATA wsd;8 J( f% ~7 t% Y! M7 k  P1 J
  6.     SOCKET sockServer;  L1 e5 e  F: n# h# K7 ^' F0 w
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    5 A1 ^5 [& X& y: ^0 C4 @2 V! c) ]5 J
  8.     SOCKET sockClient;
    4 v4 O% [6 ~/ |6 B2 Y; F- E& }
  9.     SOCKADDR_IN clientaddr;+ p  _9 ~, G2 L" G" z
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口. L% u3 ~0 }; y& D9 g+ C) }% E
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    5 }1 }) S* R% i( Y! H

  12. + w8 L* |4 E$ X, u' s! ?
  13. % ?7 k+ D# r9 r6 Z( r! w4 w5 N# [
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){5 x7 H: p3 j5 X% R7 `) f7 A: J
  15.         printf("Socket has been created :%d", sockServer);
    7 j' h5 E1 i4 ]0 j# S
  16.     }
    ' j. B4 {4 }% I) o
  17.     else{
    & z: O. F: ]* k6 s4 A
  18.         printf("Socket create failed.");! B! B/ h3 Q, ?' o( z" P+ b
  19.         exit(0);! }3 O, D3 p+ S8 y
  20.     }* s) J3 w& D3 ^( ?0 N; z
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    . q( t) V# }( N* C
  22.     serveraddr.sin_family = AF_INET;
    3 X. w, Z0 [) C! N2 k
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    4 s4 J! O1 r9 y9 q  C
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));3 E3 S  O9 M; P
  25.     char recvBuf[100];9 E. A$ X$ z, i& c; |# y3 E
  26.     int len = sizeof(SOCKADDR);+ n* B; A  U( X! b( D; g9 v
  27.     listen(sockServer, 5);//5为等待连接数; U; K3 G' p1 t' t) \. b( n
  28.     while (1){0 `4 q4 ^4 ?) c# L( K; H! q
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);3 O8 |7 @( O/ B1 r2 n
  30.         //接收客户端数据
    # H; @+ @$ p+ H& d- t8 q
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);8 p# |5 T! c6 m0 e& a3 g7 v- o
  32.         printf("to me:%s\n",recvBuf);
    6 G4 O1 t1 x. }% K' I' b$ i
  33.         memset(recvBuf, 0, 100);8 c; `/ F2 Z! W5 `5 Y+ \0 A
  34.     }
    0 e3 G! ^2 s( F6 v# P1 z
  35.     closesocket(sockClient);$ `6 d/ Q4 v9 X; Y& Z, g
  36.     system("pause");
    + |- u' v$ u& V  Q# |& Z
  37.     return 0;! a+ P3 A2 o  f' G3 s
  38. }
复制代码
客户端代码:
1 c9 j) y$ v% `% T0 q: V- S
  1. #include<winsock2.h>
    ' ~& {- s8 g1 ^
  2. #include<stdio.h>
    6 k4 f! V! c1 k+ A, V
  3. #pragma comment(lib, "ws2_32.lib"). F' ~1 ~' w7 N! b4 Q8 N
  4. void main()
    . A" x: {: ]  B9 G- t
  5. {: `1 j5 n0 y5 ^- h/ n# |6 q
  6.     WSADATA wsaData;7 k$ J  x0 C; i0 e7 ~# E3 c
  7.     SOCKET sockClient;//客户端Socket2 i1 Z' t7 q" M% q1 f7 ~# h
  8.     SOCKADDR_IN addrServer;//服务端地址$ \& @7 ^4 }- B7 B
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    $ D* e2 E  d8 s1 t/ ]& C
  10.     char message[20] = "HelloSocket!";: b' s) S9 I7 P$ x4 ~
  11.     //定义要连接的服务端地址. s( f% X, o" ]! w
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    - f+ l$ _* G" N6 _3 s+ Y. @
  13.     addrServer.sin_family = AF_INET;
    / X3 O' t1 E% H, e+ j/ F0 F
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    1 f6 F3 g( i' k' F2 m" s. g
  15.     //新建客户端socket
    + G1 D' d0 _7 c4 w; D0 R: [: x
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    % A+ h5 h3 M0 \0 @7 b
  17.     int s = 0;; u7 k* r* x8 @) @8 m3 _
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    * G- ~# C7 X; D3 F6 ?

  19. ! K, s$ L3 t( t) y% O8 f
  20.     while (1){
    # V0 r, h  y" q4 x) b1 B( B# W2 r. `
  21.         //发送数据, L) S; j# Z9 E$ u& j6 [: I
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);; v8 C0 H* A' Y( `' e0 g, X% t
  23.         printf("to server:");) G$ R! f# n. h8 h" p/ a9 U5 [7 I
  24.         scanf("%s", message);" ]) j/ y9 p& [' Q! ]" S
  25. 9 D" T6 i2 K( X
  26.     }# ~$ t8 a; S, _# k! V- `& Z
  27.     //关闭socket% s0 t% n! ~3 |. l+ O8 {
  28.     closesocket(sockClient);' T) q1 t* q& U$ J. t+ |
  29.     WSACleanup();& W) W$ m1 C# m9 q9 a# s# ~. a
  30. }
复制代码
求懂的高手来解答一下。
: t& U4 Z7 p% ?谢谢了!" ?( K" }- i% U+ Z5 Q
5 y4 N+ H7 j3 T( p
: l- `& k5 `6 `- N

- X: m' y* e) w  t1 ^9 G
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
' [/ B; W* ]4 B( r+ g" U* [recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-9-21 00:16 , Processed in 0.082628 second(s), 21 queries .

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