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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
: h+ n+ r/ V" \- w! r: q# p, d我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
: f. `9 i$ h4 _: |9 JTalk is cheak , show me the code.+ u, s% X2 o, z% Z
服务端代码:. h( u  I, f( A
  1. #include<stdlib.h>
    9 `: l" K. \6 ]. Y2 w8 s
  2. #include<WinSock2.h>
    3 Q# N2 {9 H) R/ Q6 N% C
  3. #pragma comment(lib,"ws2_32.lib")
    * ?/ y/ I. l( J8 U" z3 o
  4. int main(){
    : a; L& o% R2 N6 }- w
  5.     WSADATA wsd;  m! I/ {+ b0 p5 y5 ]
  6.     SOCKET sockServer;
    / Z" b' [, G' `4 Y5 c  u
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号. t  X- o2 Q5 {; j0 v6 H9 x, u
  8.     SOCKET sockClient;
    - f" v  ?% [6 N
  9.     SOCKADDR_IN clientaddr;
    * A+ @' g6 K2 ]  V
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口* \* F; t; @( Q1 x
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket2 R  f) U5 N& V7 T7 L! c
  12. ( X* Y0 p4 o$ t& }* y5 j; F( r
  13. $ z0 c! S4 i/ G( H& w0 a. U
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){, `5 X; y& a  ~$ \0 F* L
  15.         printf("Socket has been created :%d", sockServer);3 y( ?( k  [9 h7 C! }& H- a4 q
  16.     }
    % [% S8 \! }# _
  17.     else{
    : }' }: l3 V% i
  18.         printf("Socket create failed.");' Y% J4 q% W% [: C$ I; p
  19.         exit(0);
    . R1 m# U0 @) G! u/ A
  20.     }& a0 |/ Q3 n% _0 v$ y2 q7 R
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    7 e' v0 Z8 Y6 l
  22.     serveraddr.sin_family = AF_INET;' u  O$ |( ]7 p1 w: b8 w
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    . c) b8 w# Y( s5 |( C
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));3 @$ A$ e4 r' o, s
  25.     char recvBuf[100];
    3 r2 p- X* R4 v; d! X
  26.     int len = sizeof(SOCKADDR);( K1 a. ?# H. ^7 q& P- J9 U
  27.     listen(sockServer, 5);//5为等待连接数( `4 m/ w% y; s5 s
  28.     while (1){
    / ~3 Y' R% e7 [) B6 W1 j# ~6 _
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    - d: S# q; l% W* G9 ]$ J- e
  30.         //接收客户端数据& w* L4 ^/ e  O) F: ]0 j$ x6 a
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);  c6 f: ~0 O% m9 J' Z
  32.         printf("to me:%s\n",recvBuf);* {% ?) b5 J, E
  33.         memset(recvBuf, 0, 100);
    ) C* R' [- Y! Q1 p) e$ {
  34.     }
    1 x3 j# P) e+ N  b# ]
  35.     closesocket(sockClient);
    6 e# {, k9 G$ J- t2 ?, p
  36.     system("pause");
    8 M( ~8 B; e: a9 S/ I
  37.     return 0;6 V2 R' M8 Y. W7 X
  38. }
复制代码
客户端代码:% W) H+ @8 k/ F" m( c) y
  1. #include<winsock2.h>7 w: G2 o3 @" t4 F
  2. #include<stdio.h>6 K  G4 j% f: {) ~* |3 W  b4 {
  3. #pragma comment(lib, "ws2_32.lib")
    4 S( \( ?9 _% P$ X2 ?
  4. void main()6 P1 i% U: J0 l# T2 Q  T# J
  5. {  g% e/ b1 {0 Z
  6.     WSADATA wsaData;( \& E+ a, H. z4 q9 H' T
  7.     SOCKET sockClient;//客户端Socket7 j) P& K- D8 ~+ M* M% y
  8.     SOCKADDR_IN addrServer;//服务端地址
    # A. |% U0 N; ~& P- X9 A  f( p' s
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    7 c! V5 l2 O) l' ]9 C2 ~& J% }9 O
  10.     char message[20] = "HelloSocket!";
    . L8 }" X0 ]: l  N) `: W
  11.     //定义要连接的服务端地址
    ! n5 ]/ B9 V4 S9 |' n
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)( H; C9 T' f3 y) ?1 k$ F+ M
  13.     addrServer.sin_family = AF_INET;
    - k0 a+ m& l% S6 y. D+ q
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    ! Z5 o" ~$ c! D$ A7 w
  15.     //新建客户端socket
    / `' ?! E. E9 Q3 P, ^
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);  o! w# i3 n" G- S5 t2 w' R( ^
  17.     int s = 0;
    3 J; K- t- l% \8 i" Q9 u
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));, z1 E+ @+ {! d
  19. ) f0 s, M. E* o3 N
  20.     while (1){
    $ ~- p1 d+ }9 H; [
  21.         //发送数据
    * ?3 g8 e# C; Y/ C) U$ M0 c
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);0 x+ k- _! j* u9 T
  23.         printf("to server:");6 B" h) H% B7 B8 k
  24.         scanf("%s", message);
    " i* P$ ~! s( R, E' M1 {

  25. # {5 d+ \$ Z# e9 Y
  26.     }/ u6 [+ {) r) P7 W/ A( K
  27.     //关闭socket3 G% d! |2 X* {6 D% f1 \3 l0 k
  28.     closesocket(sockClient);
    ! G% M  ~2 p- a
  29.     WSACleanup();/ ?: e) ]1 X8 u  _: T
  30. }
复制代码
求懂的高手来解答一下。& M5 e, g& {& K3 j+ K/ d/ D' \" e. q
谢谢了!& v; k) \1 o# e) f2 ?% L. P
- C# j: R4 H6 ]) ^8 k
! Z4 s" j* P% X% ~

" O1 |( `- d% a2 k" C7 h
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为- s! g- n# j4 e+ `: o7 \% W
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-7-19 17:39 , Processed in 0.055398 second(s), 18 queries .

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