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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
大家好,感谢你的回复。- t8 E0 I3 j# }4 e. W( Z
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。0 ]2 M. I7 e; b3 U: W2 z) b. p
Talk is cheak , show me the code.8 _% b$ z+ s: b: h( L9 h* E5 b
服务端代码:
. p$ D4 ~: t' N
  1. #include<stdlib.h>
    ; a+ t- q% ~0 X% l. n) U) K
  2. #include<WinSock2.h>
    ! U" P( N, Z+ n& e$ ^" v6 i
  3. #pragma comment(lib,"ws2_32.lib")1 S: t( f! N& |7 z& X% R$ J
  4. int main(){
    " ]/ c/ ]$ O' s: @+ R
  5.     WSADATA wsd;' p2 A. X% Y6 P4 ^4 v5 C
  6.     SOCKET sockServer;
    * v% B  f( M" s7 d& B" x
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    8 f9 h0 C. c$ O8 z
  8.     SOCKET sockClient;' B6 T$ P2 u1 L' V) C
  9.     SOCKADDR_IN clientaddr;
    9 d/ f5 @. }( X; R( z) @, l
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口0 W0 J! s( j0 \9 N5 [
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    ) S. o6 [/ I, n$ H/ C. t
  12. * ?; O5 |1 H! C+ y+ q7 Z
  13. 7 Z( s% h" @& v
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){2 a9 S  P' r& y, t
  15.         printf("Socket has been created :%d", sockServer);
    " l3 Q/ X8 z4 d
  16.     }
    ; y& Z$ x) D0 E1 P, f4 Q) ~# V
  17.     else{
    ( g7 V) A/ |& T) `+ M  Q8 w
  18.         printf("Socket create failed.");
    0 E7 B2 {5 L3 N2 s5 u8 h9 t% p: W
  19.         exit(0);
      ^% ~" s9 x- k& |4 \  m, O' ?
  20.     }, g& u/ @) \/ O# d7 l! ^, M
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);6 S# ~0 F6 l" R6 J0 a6 r
  22.     serveraddr.sin_family = AF_INET;2 M5 x% Y1 A, g6 ~3 @8 q! z
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000# f* t2 }4 Q! m! Q; q( n: f
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    * V9 h& B/ F8 ]
  25.     char recvBuf[100];
    ( V2 J8 c) L& M; A# e8 e0 z& G% U1 ^* [
  26.     int len = sizeof(SOCKADDR);, A1 W( I9 Y% U4 r0 m
  27.     listen(sockServer, 5);//5为等待连接数
    ' e4 O  f9 i. e8 n1 Q
  28.     while (1){
    2 f* y4 ^* V* Y: X) q
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    ; N# [, O3 r9 k6 x) R
  30.         //接收客户端数据
    1 k7 f# \# J+ R7 b4 v
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);. r4 N. T& h" _
  32.         printf("to me:%s\n",recvBuf);  T, n& Q% `$ N6 {/ J1 T) b
  33.         memset(recvBuf, 0, 100);2 U$ e3 L' Z5 y0 _  [4 k6 |  }( O
  34.     }5 O2 G* L/ E5 Z' p* a
  35.     closesocket(sockClient);; C" h1 Z) f. [% p
  36.     system("pause");
    5 K9 j5 ^, [0 F! J! c
  37.     return 0;
    . _8 E" Q4 c8 T
  38. }
复制代码
客户端代码:1 A0 c- w1 T& N; \  B0 K4 X
  1. #include<winsock2.h>7 m' a+ D: Y+ g% \$ T. V- v
  2. #include<stdio.h>
    8 y; U7 j: o2 A& D" W
  3. #pragma comment(lib, "ws2_32.lib")! l/ j6 ^" p/ I0 R' [
  4. void main()
    ; G* x  C. t- S! h  Z
  5. {1 i( a% c# m# b. G. N* n
  6.     WSADATA wsaData;
    2 t# t4 }8 ~# @- T
  7.     SOCKET sockClient;//客户端Socket
    4 _6 B2 f2 ~& N0 A
  8.     SOCKADDR_IN addrServer;//服务端地址
    1 {- R% W1 S0 c' h# m
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);3 R3 X% h" l, {- g- X) p" a$ {4 \
  10.     char message[20] = "HelloSocket!";
    9 @5 k) y& t  C6 Y
  11.     //定义要连接的服务端地址
      C3 b. G! [  t; ?. h5 v
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)2 e' m* N9 e  U# N5 X
  13.     addrServer.sin_family = AF_INET;# z* `% s+ n0 Q/ x7 c. x
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    5 B$ U! |6 W3 Y$ o+ G3 T- n/ D! N
  15.     //新建客户端socket) C, U, g$ }0 x, V" j
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);" N. q6 C% h5 r. `' B: u+ \
  17.     int s = 0;
    % o1 @/ }& p2 t4 ~0 U+ M7 H" Z
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    & j, O  m4 \9 b7 p" D0 ]- z

  19. % G' Z+ H* _7 a
  20.     while (1){! A' |3 G3 d2 s8 T+ `* O$ N
  21.         //发送数据
    5 y/ e( U7 @% D" f+ a# E+ W( C7 f
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);. S. z5 p- y) v9 q8 \$ |) s5 |2 l
  23.         printf("to server:");
    1 w; k- w; b; l5 c0 ^7 Y7 P  G
  24.         scanf("%s", message);$ W6 ]# q4 \$ {2 ]- i1 h5 M8 P( u
  25. / Y3 k; _% H! m* U" W
  26.     }
    " @4 q  V+ d8 t" o4 L& c
  27.     //关闭socket. S. O8 d8 s0 V& x* s
  28.     closesocket(sockClient);3 A: D* ^- E# L3 H
  29.     WSACleanup();4 ^4 V. u- R* q5 o" B" }! d4 \
  30. }
复制代码
求懂的高手来解答一下。; N5 T& U+ O4 f" c) {* ~7 p3 V
谢谢了!
$ V. y# f  n! O1 k/ O+ p$ a* j# w2 p
! }3 y! h, Y7 W% d5 v- u3 c
5 K: k6 T) n) q& A9 \9 U, a
& M9 i- \) s( ~) h# G9 c% b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为9 F) B6 R- J7 p% I& W4 H
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

GMT+8, 2026-3-17 18:08 , Processed in 0.057730 second(s), 19 queries .

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