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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。4 N# W! X- V1 S$ P$ n" k& B/ l5 ~
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
+ O5 n5 x' b$ Y! _, u5 t6 b5 LTalk is cheak , show me the code.
0 Q1 x' y( D/ t8 |- K服务端代码:
) _* {# t/ G0 J- J
  1. #include<stdlib.h>
    7 t6 T8 f8 s7 Q( j9 |2 }
  2. #include<WinSock2.h>/ `- k$ G1 E3 n* s4 b1 s
  3. #pragma comment(lib,"ws2_32.lib"): s5 t, W( U& @- O$ o
  4. int main(){
    8 A% R& [) Q: f  B; ?/ `; [" m
  5.     WSADATA wsd;
    $ |. \1 Q0 P" ]) t) t
  6.     SOCKET sockServer;
    8 b, P. z7 p# ~& Z- T7 T1 H
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号9 t+ P$ g: v6 L* A. t$ a
  8.     SOCKET sockClient;/ W+ C! N: i1 `, r2 B
  9.     SOCKADDR_IN clientaddr;
    1 \' H5 B8 W3 M& j
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    ; T# h' ~( v2 Q+ |' K
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket- m# L. g0 G& z2 k( y# R9 o) {, o

  12. / V9 ^8 B. d$ I  L

  13. 2 P7 p4 b, j+ f( \
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){+ \+ N( L* q8 y: r* v1 a
  15.         printf("Socket has been created :%d", sockServer);
    : q: j8 r9 C- H( ^' N) w! b
  16.     }& C+ x, c, |! V+ t/ }
  17.     else{
    ; }: ~, q- ^$ u! q
  18.         printf("Socket create failed.");4 ~+ ~; G* i4 s9 n4 q
  19.         exit(0);, }! |+ D3 e% z. r( r% y
  20.     }! A# R4 g- W+ ^. ^# l
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);: X3 Z$ L+ }: g" Z9 t3 c2 m0 s
  22.     serveraddr.sin_family = AF_INET;
    7 L" S% x3 |$ Z( C
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    ; k3 X2 J( b2 B
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    : h0 T( C; E# [
  25.     char recvBuf[100];
    6 k5 ?! C9 R% [- L+ j
  26.     int len = sizeof(SOCKADDR);
    + w/ A7 h$ L$ g1 P; `' r
  27.     listen(sockServer, 5);//5为等待连接数
    ) D" L4 K2 r( B2 V
  28.     while (1){8 |' v; W, W8 m+ s; T
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    9 @# D( ]6 I) Y! L, o
  30.         //接收客户端数据4 K3 s  |& E) S1 c7 U$ f
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);# s5 C6 [' H. D) i. F. Q) V8 Z4 _
  32.         printf("to me:%s\n",recvBuf);2 k1 t& i- r- c2 c# {0 Y! H  s
  33.         memset(recvBuf, 0, 100);; k9 o& G5 X3 e7 @+ F. k4 M
  34.     }
    # I1 N7 z5 v* m9 f
  35.     closesocket(sockClient);
    5 n  T0 [) g) M; J9 m
  36.     system("pause");3 z4 S0 X8 w8 H( R5 _# k% r
  37.     return 0;1 \  T* }1 o) X* o! v: U
  38. }
复制代码
客户端代码:7 d) Y/ M6 L; m  A, T, s
  1. #include<winsock2.h>
    ) s7 k0 H9 Y+ W! N* M' w( x( N) i0 G
  2. #include<stdio.h>
    , l# h) q* X1 P3 C
  3. #pragma comment(lib, "ws2_32.lib")
    # v- f) L& d2 M: {$ ?; i5 b) I
  4. void main()& G& q; b0 i( H7 S: {
  5. {
    ! I3 b- b& G( h5 |
  6.     WSADATA wsaData;, @# F  k/ y& l% B
  7.     SOCKET sockClient;//客户端Socket
    $ J! _1 E0 T+ p) S* Z" |
  8.     SOCKADDR_IN addrServer;//服务端地址
    1 r5 [) _7 F4 e
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);; G/ E& x; y1 d" N, {+ k
  10.     char message[20] = "HelloSocket!";
      B1 ]3 ^) g; l7 D  F6 ~
  11.     //定义要连接的服务端地址
    & m8 F3 ^" h( L
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    / M% K& u2 D# R3 a/ v
  13.     addrServer.sin_family = AF_INET;
    ' k( K  d- ^1 ^# r  m
  14.     addrServer.sin_port = htons(6000);//连接端口6000) O* [. f/ }/ s9 ]
  15.     //新建客户端socket
    8 Y9 x8 f" X! [) R" l
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    8 d# f* _& _, M& V1 q
  17.     int s = 0;
    ' W+ D* c; `; Y. K
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));, N1 H7 x# r3 c3 ~

  19. % Y# H8 V! m4 ^5 f
  20.     while (1){
    3 [+ @+ m# }6 }1 a( Y
  21.         //发送数据
    ' Z+ E4 W: x6 y
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    5 ~2 }4 f" ^" O- m9 |) A' a
  23.         printf("to server:");& C" u* h6 A. e4 \. P. O8 G% ]  m
  24.         scanf("%s", message);
    $ O( x7 w1 Z* R$ U" n2 J: w$ z1 S
  25. 8 w9 O" c/ M- {+ r! [% {) N
  26.     }
    . f1 V& n! W; B6 v" f6 J0 s
  27.     //关闭socket
    + C2 W) X# B/ l/ i
  28.     closesocket(sockClient);
    : f: l4 P8 Z( T" P' @; o
  29.     WSACleanup();
    : m' k8 C1 O* z, y7 u1 c+ T
  30. }
复制代码
求懂的高手来解答一下。
/ p, I$ V" o- _5 _) X, `4 T谢谢了!
6 ^4 N! X1 f0 D" S4 j
( v3 B. `$ N8 L5 g1 \" l# z3 e

) U. B' [) y0 V) ^9 \5 F
# d: k0 _7 Q, S: @
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为7 a5 {3 |8 z+ f9 W( l6 V* ]7 J+ x
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2024-5-19 02:52 , Processed in 0.137360 second(s), 17 queries .

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