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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
' L9 Y2 w5 p% F0 ]我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
! ]3 G. O! ^* b* P% U: KTalk is cheak , show me the code.0 V( I" o+ h% {
服务端代码:3 M( D+ F/ O: _
  1. #include<stdlib.h>0 A# j- c; ?, R
  2. #include<WinSock2.h>4 D7 U9 {( {! T; J8 ^9 J
  3. #pragma comment(lib,"ws2_32.lib")
    1 Z# H1 W+ b, [) _% q% i
  4. int main(){
    * N7 N, f. ~+ r- c# V: S
  5.     WSADATA wsd;7 S1 C; B  u6 Q
  6.     SOCKET sockServer;. x+ `( q2 E" z/ y, {
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    ! b) c& P4 s3 j1 @0 T1 X, Q+ U
  8.     SOCKET sockClient;
    + _  q/ q; T+ {/ B# X0 k
  9.     SOCKADDR_IN clientaddr;2 z2 i# A6 i+ W, d
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    . _: T5 z/ j2 e
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket3 K. O* w/ R2 R! I0 s- I! v6 y3 E: r

  12. . U0 k5 M# o- S- L# y
  13. 6 l6 b% [" w/ V
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    6 x8 N. [9 T0 {- `9 r. c
  15.         printf("Socket has been created :%d", sockServer);
    ( s5 ?* A% C6 W8 y4 {
  16.     }
    , C7 H. Q0 C+ @9 n$ {
  17.     else{/ Y# z" F2 x% p
  18.         printf("Socket create failed.");: T1 N' B$ ?+ D
  19.         exit(0);
    ) W$ ~) Q( @$ q6 W$ s, `5 v
  20.     }
    ; F2 R& A! f+ C! s9 E
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);" r& b4 K5 e7 \; J
  22.     serveraddr.sin_family = AF_INET;
    ! B$ @% Z9 R& ~# }, ~: V, `
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    1 d+ ~2 U: e* }# o; y
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));' i4 E3 x5 a3 X6 K! E6 f
  25.     char recvBuf[100];
    0 ?# G5 b! L1 ~- t9 W% F
  26.     int len = sizeof(SOCKADDR);
    & |  V4 u8 [: X& {7 z/ {
  27.     listen(sockServer, 5);//5为等待连接数
    5 U/ f7 Y& {  [  I8 d
  28.     while (1){
    5 s; m; C2 _7 {4 c. H8 a1 Z/ [
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    * Z/ e) I* j6 H/ r4 H
  30.         //接收客户端数据& Y/ Q* ~. Q3 A1 a
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);  i+ `- t  N6 H- G0 l
  32.         printf("to me:%s\n",recvBuf);) A3 B( Q; v9 c4 F, [
  33.         memset(recvBuf, 0, 100);3 F! ?$ \' b, e7 p+ k( g2 r
  34.     }8 S. A& S3 v+ e- y
  35.     closesocket(sockClient);: g! C0 a1 E4 f3 p* X+ x
  36.     system("pause");1 b2 ?) Z- s* o7 c+ X: w
  37.     return 0;
    + H' h) E2 T& ~$ T7 ~) y
  38. }
复制代码
客户端代码:1 M3 m! B& O4 A) D
  1. #include<winsock2.h>' v7 g1 S% T5 J" z
  2. #include<stdio.h>
    ( N- x* z, [5 p, N
  3. #pragma comment(lib, "ws2_32.lib")
    ( H1 R( b3 v2 |6 w: D3 s9 G$ i
  4. void main()
    8 p7 o( p4 Z( A' e" m+ I
  5. {0 r* `! C8 F$ k' |7 j6 S
  6.     WSADATA wsaData;
    8 j* s; E1 I) ~: p6 O1 g/ k$ t
  7.     SOCKET sockClient;//客户端Socket% _) G. t4 F. g. C- s! |% W9 n) L
  8.     SOCKADDR_IN addrServer;//服务端地址
    $ j7 R3 x1 Q, I9 t  h; m
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);, {# I8 M4 i  e
  10.     char message[20] = "HelloSocket!";
    1 ^0 c# o. y; y" S3 |
  11.     //定义要连接的服务端地址( ?! j4 `9 ~7 F- ?4 C7 ^6 O! t
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    ) ^. C% U4 @6 _3 f
  13.     addrServer.sin_family = AF_INET;
    7 [1 L9 b% Q% O; j
  14.     addrServer.sin_port = htons(6000);//连接端口6000# I( K6 K( T: V. H* r
  15.     //新建客户端socket
    0 k) q8 |5 C. J4 Z
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);# j( Q& N5 K1 E* N7 L5 z
  17.     int s = 0;
    # `! Y; x0 {0 s6 |( r- f
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    . x7 A  }1 w- F  ~9 @" ~+ A0 g5 l
  19. + s0 v$ M6 l, V6 L2 ]+ ^% i
  20.     while (1){
    $ F  m# v8 o8 m6 K: ?) E7 q
  21.         //发送数据) j7 n& [* a. G% b! L
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    6 ]/ o) L" T0 V2 E9 Y5 a) B
  23.         printf("to server:");
    ! B- A" I; c8 @- A: d: o
  24.         scanf("%s", message);
    # u0 X+ Z# o/ _$ ]/ Q) V' J

  25. : J$ ?) c) R2 G4 U2 X
  26.     }
    1 Y/ c; o9 m8 x! I# I7 N
  27.     //关闭socket: S( g: B' @! Z# T! I4 H6 |. k  D
  28.     closesocket(sockClient);
    ( r. q" p2 s+ g6 y5 }# Z6 j
  29.     WSACleanup();2 C) i- z; K+ i: D: H
  30. }
复制代码
求懂的高手来解答一下。
: L$ W) M: M* \9 v% R, s谢谢了!% l. M7 k( |  _8 x
% x, T9 z" [2 t( _) N

5 i& a1 L) m, D8 o
2 `$ R6 P/ [4 l. d% W4 \* ]: W7 @
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
& G2 z1 j! _+ Krecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-4-30 22:19 , Processed in 0.063464 second(s), 21 queries .

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