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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
# `4 _+ Y/ B, a+ t4 z2 S2 R( _5 l我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。$ z. x) h9 ~/ D2 @4 M
Talk is cheak , show me the code.& ~9 W6 i% N! g, v4 `/ p( W
服务端代码:
- C+ ]  Z* |1 |' O* B9 g/ Q9 I- D
  1. #include<stdlib.h>
    ' u( E/ F, N6 Q$ Y: k3 K
  2. #include<WinSock2.h>
    / G- w1 D; }: J6 \4 E
  3. #pragma comment(lib,"ws2_32.lib")
      s) w' W6 {6 \9 \
  4. int main(){5 S8 ^- T! E" ?, Y: T# K
  5.     WSADATA wsd;
    5 ^% a" J1 C8 o: n
  6.     SOCKET sockServer;
    " n/ n& }2 ~" v7 C( l
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号+ B, i' ?! Y4 ]1 y+ }% p
  8.     SOCKET sockClient;
    % i" y' d# X5 ~. M/ h: _6 M9 X
  9.     SOCKADDR_IN clientaddr;
    3 H  l. @4 A- l
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    ' B: m+ U. ?0 d/ m* }
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    " B5 W8 ~7 u9 s; p4 y, a
  12. 2 |, |& Q8 ~* Q+ }: Z
  13. & L) e# A2 q: G9 f
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    6 j/ D4 c2 z" V
  15.         printf("Socket has been created :%d", sockServer);: B- w+ q0 e8 X( c
  16.     }. f2 C# ?" ^8 b8 b4 n8 i8 x/ t8 Z. ^
  17.     else{
    / _& K( N4 O/ X/ E1 n8 X
  18.         printf("Socket create failed.");( Z. C0 N/ ^7 G% ^( b5 t
  19.         exit(0);; G: U3 e7 q& A! I2 r- y8 H
  20.     }& `; j1 N% z. Q. m( P4 W( T7 k, T
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    * T# s0 @6 t0 k7 R$ @, D
  22.     serveraddr.sin_family = AF_INET;
    " h) ^. a7 Y0 e: J- C: F
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    6 k! X6 X/ w, e0 l+ H. s5 \
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    ; t0 A( h, Y" `, a! J* i
  25.     char recvBuf[100];+ g- m( p6 ^: T- t% b$ I: K4 H; a
  26.     int len = sizeof(SOCKADDR);3 X! y1 E. K- x0 C
  27.     listen(sockServer, 5);//5为等待连接数
    % \! F" K3 ]9 t6 `. t
  28.     while (1){
    9 G2 g! c! D) A- h" Y- w* A# v5 X
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    " w3 Y+ d; f% C3 T7 J4 K
  30.         //接收客户端数据$ G# u5 p+ N9 k( q
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    6 b% u% ^8 K' c2 b
  32.         printf("to me:%s\n",recvBuf);
    9 e% [& K1 s' L+ r% ]$ U8 S* m
  33.         memset(recvBuf, 0, 100);
    4 v/ h$ U3 H) c  x
  34.     }% p5 A+ Z  {! D) R! W; W
  35.     closesocket(sockClient);0 H, n/ W; V" b
  36.     system("pause");
    2 O+ K7 S1 Q" v" a0 H! b. M
  37.     return 0;, p/ v+ z' ?" {( ]& Q
  38. }
复制代码
客户端代码:5 s2 I8 `% x2 M7 l) A
  1. #include<winsock2.h>
    " C2 o  X, n. _0 \
  2. #include<stdio.h>
    : `6 i! n. y( r. P1 j  Y0 M
  3. #pragma comment(lib, "ws2_32.lib")0 e; L) O' A2 W) b* x7 _8 [
  4. void main()
    / L9 c+ R# l/ y2 j
  5. {
    / a+ ^1 Z  r1 }# M2 Y
  6.     WSADATA wsaData;# K' E5 o2 _, J2 u' _' H
  7.     SOCKET sockClient;//客户端Socket* z" I9 H9 f0 k
  8.     SOCKADDR_IN addrServer;//服务端地址2 @. h  J, L" _. i
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);: g& V+ A% p% a  \& }5 L
  10.     char message[20] = "HelloSocket!";& B1 C9 h! J) k4 o' k
  11.     //定义要连接的服务端地址9 M' H1 e+ G- T$ T8 Q2 p. D  j
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    0 S- m* n% `3 H
  13.     addrServer.sin_family = AF_INET;
    6 ^8 l( k/ W: l& V- E
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    ) R# v8 j3 @0 [% w: e: \
  15.     //新建客户端socket: y9 M, T: y+ s- y/ z2 a
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    ; I) I, ]$ t3 ~7 e% v! Z
  17.     int s = 0;
    " `8 s; o: v" ^6 t7 b% u# `6 ~+ a$ ^
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));* q8 Z6 G7 L9 E: W9 C
  19. 8 f4 X$ l$ z1 a0 L
  20.     while (1){5 }- m! C  T$ W3 e! p; q  p
  21.         //发送数据" Z, b- G; c# h% C# |. t* y
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    ( e/ I9 ^5 V$ C4 `' x0 x9 ^+ q
  23.         printf("to server:");3 C# |! I5 [- |; u- g4 K
  24.         scanf("%s", message);
    ( }( U4 ]" [5 X6 t

  25. . s% L5 M& T: e& n( j2 J  u/ G2 L
  26.     }
    5 F' d8 {* [6 a4 f3 ^5 p3 X( ^1 r
  27.     //关闭socket/ ]; `$ N$ z: F/ J
  28.     closesocket(sockClient);
    1 O; H7 v: K" O  A) s$ H; K9 V" C
  29.     WSACleanup();" l/ o0 W1 E2 L1 ]; [/ B$ @
  30. }
复制代码
求懂的高手来解答一下。
# z7 y8 U2 Y+ c$ h( p) v谢谢了!
3 g' z) s; m. D7 q" O4 e: u$ @
4 a0 {" q; {) ]. P7 d7 v

% O9 H4 Y& q  k* z5 H# H/ i* i  u" C- X& r) s$ ]# ?$ 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); 这句改为) ~8 A1 Y7 {* h% g9 `
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-6-19 23:59 , Processed in 0.079864 second(s), 19 queries .

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