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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
大家好,感谢你的回复。  }( x! b/ a& n: F3 {$ G4 W
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。$ l$ ~9 [, i6 l$ U
Talk is cheak , show me the code.
' x7 {6 W6 X1 X/ e- s. b: G服务端代码:
. m  n. i/ ?6 a
  1. #include<stdlib.h>8 j; R! B+ e; ~
  2. #include<WinSock2.h>2 l7 U* D: W, d9 S# f4 N3 h
  3. #pragma comment(lib,"ws2_32.lib")
      i9 C8 v4 n. {) d7 o
  4. int main(){
    8 b; k8 d; Z/ p6 z+ Y* C% c
  5.     WSADATA wsd;* b/ l2 z% K/ G/ F7 H, E$ `
  6.     SOCKET sockServer;& L& d  ]9 j7 e3 |6 g- a
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    ' |2 D0 A  G( v5 ], i* b
  8.     SOCKET sockClient;
    . x9 t& D, \( {0 M* B% @
  9.     SOCKADDR_IN clientaddr;
    ) l  }6 n+ @9 z
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    1 o" R: r% g) Y
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket% f3 b6 z) U2 t: \4 t8 _

  12. , ~3 e- q8 b3 H5 F) {
  13. " m1 y4 C" s( p6 O
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){, I, S0 w; a* y4 u
  15.         printf("Socket has been created :%d", sockServer);
    , E( w" N- i6 {% h& o$ M
  16.     }
    - g2 s% o( c( e& W2 }3 w
  17.     else{
    & E  ^& V" I  Q( n1 i' _% u+ u; ~
  18.         printf("Socket create failed.");
    , i* W+ E. A/ M; ^! _' T$ Y8 Z
  19.         exit(0);
    % e% Z9 S- P* D, w( a
  20.     }
    , R+ d6 G) T1 @# ~
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    1 g3 |" Q2 S9 Q  |- X& Y( Z8 S
  22.     serveraddr.sin_family = AF_INET;2 J2 s$ @' B0 D1 z5 y/ Q  w
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000; `8 M" y/ m' w9 P, l' }
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));0 u( C3 ^  a$ U9 F% o
  25.     char recvBuf[100];% l( C+ _' O! u2 O9 Q: o* A
  26.     int len = sizeof(SOCKADDR);' A3 _4 c4 p/ G1 p
  27.     listen(sockServer, 5);//5为等待连接数
    / s, ~$ z* X0 I0 s- z8 z1 E
  28.     while (1){# \) X, _! `* ]& r: T: J
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    # Z' N1 q7 W+ D) b3 C5 E
  30.         //接收客户端数据1 V5 N: s" s9 ?0 H' W$ `+ R
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    0 o* G' g" ?1 k# B. O; c
  32.         printf("to me:%s\n",recvBuf);  u, W% z8 e5 o0 Q9 ]" K# x% o
  33.         memset(recvBuf, 0, 100);# W6 z2 [: p$ G8 E0 @
  34.     }. ]' H) j4 R5 |9 H; N( R
  35.     closesocket(sockClient);" ]! p- t1 L# h* |7 M
  36.     system("pause");8 U! n1 R% c, Y: _# z% \) j8 L
  37.     return 0;
      t( z+ P6 ?  P  @8 D8 B% J
  38. }
复制代码
客户端代码:/ ]" I& r- t( a: }' E6 ?3 f: `
  1. #include<winsock2.h>3 h! Z  [1 x9 f6 b% S/ d: v0 U
  2. #include<stdio.h>
    8 I8 S5 \- W9 k
  3. #pragma comment(lib, "ws2_32.lib")( u8 Q5 H9 s+ U# t% F. s: ~  X
  4. void main()
    / V0 h5 R" F  H
  5. {
    ! \9 _% d1 t4 m1 f- ~+ F9 c" x& A
  6.     WSADATA wsaData;$ p5 G8 C% d9 L0 t( ]3 V% b0 v
  7.     SOCKET sockClient;//客户端Socket5 p, z" J2 x/ t7 n
  8.     SOCKADDR_IN addrServer;//服务端地址+ `' v0 t7 P  o2 Z
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    $ S+ s. }3 @* R! J4 i
  10.     char message[20] = "HelloSocket!";
    9 N6 x) T  g# \
  11.     //定义要连接的服务端地址
    & ^: s" y8 o8 p0 C
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    2 |  N" H1 ^( [3 Z; \" q! a
  13.     addrServer.sin_family = AF_INET;
    $ n( z3 A( w! Z# s$ N, [9 N
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    # _& p% |1 W" R+ @5 b
  15.     //新建客户端socket
    1 f/ l- e' ]# C* E* P4 v
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    , b1 g  Q. c+ Q
  17.     int s = 0;% I5 ?# I* ]' p1 i2 o! f: a4 }
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    ; ?' U: Z8 z& K6 i7 i' x

  19. / {1 q8 M: [: w; s
  20.     while (1){9 a6 [! r0 K% x
  21.         //发送数据
      o! N$ }6 M4 R* p( L2 C
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    2 f( S# s( ?' o6 n) A3 }
  23.         printf("to server:");2 Z" X2 V5 R+ y
  24.         scanf("%s", message);0 V$ ~* b  }; ]0 m  S2 S! u5 H
  25. % I6 b: l9 l6 k7 ]
  26.     }
    . _- N9 U/ _/ x5 h/ N
  27.     //关闭socket$ N& g; ~! J& V! O2 G
  28.     closesocket(sockClient);" E' R! k# R/ y4 J* e
  29.     WSACleanup();6 U# F3 [3 z- P. r; ?  @
  30. }
复制代码
求懂的高手来解答一下。
. L5 D. n  O8 a  r2 j谢谢了!
# P4 G8 [/ d" X! Q  p1 v( N) U- T5 u
$ f) h! A  y, D9 v
7 W4 Z* e" i( Y, t0 Z: h
' l) D6 R( [( s7 n, s8 l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
$ [1 [. ]9 H1 G+ {1 Y+ Brecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-4-30 21:17 , Processed in 0.084655 second(s), 20 queries .

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