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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。# w2 M3 M; o7 H; d8 \* p! f1 \
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。7 D  e  f, ~: g8 q& q; P: A
Talk is cheak , show me the code.
' L# B6 f9 [5 P! M, x. ?服务端代码:/ g/ h0 W8 p# e' x" R4 g# N
  1. #include<stdlib.h>) y0 [, [! V( }3 D
  2. #include<WinSock2.h>
    / N  ^( i5 y! J0 x# ?
  3. #pragma comment(lib,"ws2_32.lib")
    * b  I/ d3 I' r
  4. int main(){
    0 e$ D; @( I* N/ ^3 K" b) S
  5.     WSADATA wsd;
    7 t1 U$ n& U  @  n5 l' _# I
  6.     SOCKET sockServer;
    7 \6 E* W' U5 G& z' S
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号* K% L- ?* U: @3 ^# f# Y! M/ ~- g8 K0 w
  8.     SOCKET sockClient;
      c- J9 V: ~8 O* m
  9.     SOCKADDR_IN clientaddr;
    % I0 F: f( F* V8 E$ X
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    " g( L7 t* R- t# D, Z+ D/ O
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket; k- n4 e6 N* F4 R
  12. - B5 B1 j! L3 |% u) R, t

  13. 4 _$ R5 l" O4 d. Z% r( ~) F( {/ H
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    4 l, ~+ y& [( a' u6 |
  15.         printf("Socket has been created :%d", sockServer);2 J, V0 s: E+ e; [
  16.     }2 q9 K+ p  D# @) Y: m7 p8 O0 W! F
  17.     else{1 ?2 F+ I2 o* Z7 D" O$ T4 Q# N
  18.         printf("Socket create failed.");
    / o$ W' i, l3 i# L! a: E
  19.         exit(0);4 ?" z$ I' j8 K/ i
  20.     }0 u* u" P6 p7 Y, X9 F
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);' a5 c& Q! c  N2 m! O6 u' {
  22.     serveraddr.sin_family = AF_INET;8 a! D5 p0 i  g; v% q0 T6 T  t
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    % L3 Y9 g8 t9 H6 ~; n
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));4 A+ s0 c$ B$ K# B
  25.     char recvBuf[100];
    3 G. z- b1 [' I& T, H9 G) P; r) H
  26.     int len = sizeof(SOCKADDR);
    8 _+ N: t  w, C' c6 k5 J6 \
  27.     listen(sockServer, 5);//5为等待连接数
    ' [: ^. W+ s6 P& f
  28.     while (1){
    - ^( a1 ?, J: I- O1 R
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);( _$ w( z0 m8 d$ H+ [! |' Q
  30.         //接收客户端数据! P' a4 I- |2 J! m2 S
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    / T/ ?+ z4 }0 }' E0 K5 {
  32.         printf("to me:%s\n",recvBuf);
    8 n8 E8 Y5 T3 g5 o
  33.         memset(recvBuf, 0, 100);7 |2 o3 Q4 Z0 O
  34.     }4 O) ~2 ?5 ^, h9 y! v! |3 }
  35.     closesocket(sockClient);# m6 x5 L. K1 D3 ^/ {5 l* T9 j
  36.     system("pause");
    4 O* j4 u6 v/ I  J
  37.     return 0;
    ; p5 b- H3 X/ s8 b0 m
  38. }
复制代码
客户端代码:/ j7 O4 @, p; w) y8 ]0 f
  1. #include<winsock2.h>7 A5 s' k+ t3 t+ _, `
  2. #include<stdio.h>
    , P- [  {& T3 z3 ~8 T  s
  3. #pragma comment(lib, "ws2_32.lib")
    ( L; ]9 `, x( L# A* S
  4. void main()2 U! D! e8 V- L
  5. {: b3 b6 Y- K( t
  6.     WSADATA wsaData;8 V1 M0 P8 P2 H, X; [3 ~, ?
  7.     SOCKET sockClient;//客户端Socket
    4 x# T: U1 d2 ]8 r* [
  8.     SOCKADDR_IN addrServer;//服务端地址  m8 S8 F8 F4 R6 \. }( L
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    $ s1 \. M) k5 N  L1 K/ _! p
  10.     char message[20] = "HelloSocket!";
    5 b0 ~' I# P, o
  11.     //定义要连接的服务端地址+ ?. @3 F- M7 H9 Z# ~% |/ F8 K- t
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)9 B! A1 u; P* s; h- k
  13.     addrServer.sin_family = AF_INET;" W. O9 L) s- p/ ]
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    % v1 A; B; S3 v# X
  15.     //新建客户端socket
    $ f: o$ P! U" k+ K! J
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    & ?/ o: \+ S7 T8 ~
  17.     int s = 0;
    5 B* ]% [+ H  z: N$ e3 D" f( j
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    : _  @, \4 W/ b, c7 x

  19. ) ?7 B. n* G5 n7 |4 H6 n$ b
  20.     while (1){
    3 Y9 R; t* f# l. L, O  c' `. K
  21.         //发送数据+ H/ A3 I& U) E' g/ H2 P
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    ' {$ u2 ]% ]; T7 d& ]9 y/ b
  23.         printf("to server:");! I  o# r' k# \* Z" M& f& [
  24.         scanf("%s", message);
    # v1 l0 W' n/ p, g

  25. 4 S; @' K: ?7 _) }) }
  26.     }
    * ?3 d) W6 x4 f  N' v% s
  27.     //关闭socket. M, i! H) z3 D* C" [6 ?
  28.     closesocket(sockClient);+ d( r, ?+ ~( Z
  29.     WSACleanup();3 I) f" S7 `6 V1 Q& S+ u
  30. }
复制代码
求懂的高手来解答一下。/ S% D# H6 K) c' \3 W3 u& z5 M. k
谢谢了!
$ C3 U* Z4 z4 J# G% `! O5 D7 ^

" u* N# ^7 T& r+ U$ A+ \5 o% H9 P; p5 T1 D; v1 h: C9 `% V+ w- r9 z
( u! Z8 W" c( \$ q8 t+ z8 d7 u* P- f
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
, p7 @; G8 n! W' Z) Rrecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-9-21 00:12 , Processed in 0.057732 second(s), 18 queries .

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