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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。' v/ ]$ ~) \- p: Y, I) k
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。2 T$ D* K7 x5 o) y' Z' ]9 n* g
Talk is cheak , show me the code.
9 G: K/ E1 P9 O( [3 |) C" E' Z服务端代码:& }8 p/ I8 R( h& m
  1. #include<stdlib.h>% ^7 m/ {) \' _% d3 w3 J# F* M$ T
  2. #include<WinSock2.h>! `1 K+ i, _& @/ h- T
  3. #pragma comment(lib,"ws2_32.lib"). S& }, }: j! C
  4. int main(){
    3 y$ w* |7 L" A9 o, A+ R" {2 `
  5.     WSADATA wsd;
      G! K: \3 N* V  r
  6.     SOCKET sockServer;0 m) q" J* Q5 o9 E0 }6 i; }; m
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号: \. W3 ~9 w+ b% `
  8.     SOCKET sockClient;8 j6 p, o1 `* g5 \" @0 u
  9.     SOCKADDR_IN clientaddr;1 Q2 T; `4 D2 E2 A( ?/ G' S( J
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    ! _& @9 e6 ~/ U! A8 P0 r
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket  p" @9 K( n, o+ @# o

  12. 1 \9 c0 s2 f# Z$ {! `
  13. * m; S" z  D$ t+ i: Q3 z  j$ z
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){+ [3 ?0 v, o9 q' [4 ?1 q' L8 Y2 `/ F
  15.         printf("Socket has been created :%d", sockServer);. G) w) R" a& i( B' B, E7 @" U
  16.     }% O4 ]* z, s$ [. I: y
  17.     else{! M9 N/ i2 M0 ^
  18.         printf("Socket create failed.");% C! T3 t) b8 y* G5 ~, u
  19.         exit(0);2 @: l3 R3 O& ~' c% u4 Y
  20.     }! s8 B( E+ u$ Y
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    0 O0 x* B2 u" E/ U; v
  22.     serveraddr.sin_family = AF_INET;
      P' @$ b: E3 }: ?& ^
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    5 r) n4 q5 f5 B6 z, `0 f& R9 M
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    ' E, |' W- f# U6 M- G7 Q
  25.     char recvBuf[100];2 M" `0 j  d/ e9 U
  26.     int len = sizeof(SOCKADDR);9 X( Z# `5 O! G6 A3 H( V
  27.     listen(sockServer, 5);//5为等待连接数  s6 W" [6 W: h1 U- ]( f4 Z7 }
  28.     while (1){
    $ X  \! B6 V  P& G+ y9 h9 w# z
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    + h/ `. }+ g% R& {& A$ A  U
  30.         //接收客户端数据
    7 ?. S( \9 R: q( |4 Y8 h
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    % m0 I0 }5 b* e1 A; _
  32.         printf("to me:%s\n",recvBuf);8 E3 }! }* ]2 y
  33.         memset(recvBuf, 0, 100);  E" f) g7 L; Y
  34.     }
    % F& k6 J, z' U: a5 h& T& A/ v
  35.     closesocket(sockClient);7 L( x& }* z( x3 O/ q5 T6 s
  36.     system("pause");
    . w$ q  c4 v$ n8 U+ |7 z
  37.     return 0;
    4 u) \" M8 A6 p4 U. o" E
  38. }
复制代码
客户端代码:
1 z4 o6 i+ p- K% z4 e
  1. #include<winsock2.h>' p: I8 [% G9 |2 \
  2. #include<stdio.h>
    * q) Y: E4 p: K' |# B  a
  3. #pragma comment(lib, "ws2_32.lib")
    : @1 F3 G' m; [- ?
  4. void main()
    , d# M9 |, ?. B( g9 {! h
  5. {  Z7 z3 }3 |* m
  6.     WSADATA wsaData;4 p6 I2 W8 V1 Y% o& N$ s& d
  7.     SOCKET sockClient;//客户端Socket/ E0 I. C# |: y$ S  F" Q
  8.     SOCKADDR_IN addrServer;//服务端地址/ m) Z* ^2 P  P$ @. d* F
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    5 T& |: Y6 X* }( U8 e- w+ m0 G& p
  10.     char message[20] = "HelloSocket!";
      |, k7 ~* D# [6 n& k5 e
  11.     //定义要连接的服务端地址
    * x7 u$ s6 ?. s: j
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址); P# M1 m+ N! t  e0 ~
  13.     addrServer.sin_family = AF_INET;: `  D6 M' T9 N" `# u! K5 w1 M
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    + S- q: g* w9 N# l
  15.     //新建客户端socket5 B; b: w- W: g# B$ ]
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);8 {; @* c' N  C. A7 u% f3 s" i
  17.     int s = 0;5 R0 o3 @! h( E9 ~! r' z
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    0 b4 b1 M" g* {; I
  19. - Z* v4 y0 _0 X  |9 [
  20.     while (1){8 o: |; Q6 G  B0 q- W" C& J( n
  21.         //发送数据
    6 p- n% V: b! [8 v# B$ u& g* m( F. C
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);: b% t! F$ r: d2 i, }. h, B7 \6 ]) c% s" ^
  23.         printf("to server:");
    . R" T2 r7 p$ ?3 ]1 H5 F
  24.         scanf("%s", message);: S  F# r" {9 Y/ G: J/ d

  25. : P! G4 F7 l6 F7 b
  26.     }
    5 p! [  p* V" ~* ~1 \
  27.     //关闭socket
    6 `  a7 ~' |7 ]! R& Z9 t
  28.     closesocket(sockClient);! E6 W" q% |0 v) O0 x; v6 e
  29.     WSACleanup();8 F, B, N( T2 ]% H
  30. }
复制代码
求懂的高手来解答一下。1 X1 ~# ]' O( ^% c
谢谢了!  v- f. [* V3 D5 l( m) g

7 u/ U* T9 A+ i) S  T$ t
: @4 ]; i4 p* x4 W+ M6 h! \# j
( N# H$ ]0 Q7 n
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
' \4 p. s  `0 U( E# b3 Brecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2024-12-22 18:03 , Processed in 0.150154 second(s), 18 queries .

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