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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
大家好,感谢你的回复。% p  Y1 j: ?7 I9 }! ?0 e% o
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
0 A6 J8 e. k; ~5 r0 w+ Q" TTalk is cheak , show me the code.
. {# [, m; }3 O  r  c! @服务端代码:
+ p' [. T  H+ O. U
  1. #include<stdlib.h>
    0 _( A1 v0 H! ]: p
  2. #include<WinSock2.h>4 `) I! G3 d, E) }6 h
  3. #pragma comment(lib,"ws2_32.lib")
    0 q$ [! R3 E8 O* |# U
  4. int main(){
    3 E$ U$ \$ i* v' y
  5.     WSADATA wsd;( {7 c# A( s- [' R
  6.     SOCKET sockServer;
    0 u# T# x. c2 S5 ^! `; V
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号3 J3 y/ c2 o% V. g. _
  8.     SOCKET sockClient;; _+ r4 E" J* e6 ^( a" ~
  9.     SOCKADDR_IN clientaddr;4 X5 I5 j  q, L7 ~; [/ s2 V1 I
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    . x/ _$ e; p4 `5 a' g% r- t
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    6 }$ p, Q- A0 W' u- ]

  12. 7 c% ~) z, \1 X( n: L) ?

  13. $ X  u! ?5 R6 Z& A( O& M
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    " b; a* s8 P1 @
  15.         printf("Socket has been created :%d", sockServer);
    ; p3 D7 y& N+ f* s
  16.     }7 A3 u% [2 x+ x4 _  t. q8 o: ~
  17.     else{  v) f& E: B0 H) j. v! o
  18.         printf("Socket create failed.");
    3 V) T+ g& p3 e/ [/ R& s
  19.         exit(0);/ g  T. X  D& o! G) `$ C
  20.     }
    * {+ l' d- M& g2 S  I: @
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    7 j. N  i3 q+ t4 {
  22.     serveraddr.sin_family = AF_INET;
    3 X( B- P9 z) v( i/ f2 D+ ^
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000, H  \0 J" L! n5 A( P
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));) J% y& l/ N' R! {; l
  25.     char recvBuf[100];
    0 j9 N7 h4 h- I4 f0 B; y/ j2 g! X
  26.     int len = sizeof(SOCKADDR);
    & r8 M- g# z) j1 {' m. A9 u4 F
  27.     listen(sockServer, 5);//5为等待连接数
    : H6 v9 Y, F- {
  28.     while (1){
    . \; d/ g: S. x& `$ g
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);1 ?$ K8 L  u! P* q/ a4 O) Q/ k5 K$ n
  30.         //接收客户端数据8 d4 q4 g/ L. K& g
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    , \4 O1 ?$ w. [& f" E; q) u+ }2 Q; d
  32.         printf("to me:%s\n",recvBuf);
    3 q' q$ w4 [7 {9 u0 @
  33.         memset(recvBuf, 0, 100);& ~# B5 D0 J/ t
  34.     }/ R  x4 f2 T7 y4 Q" p, n; t
  35.     closesocket(sockClient);% e9 P  T; ?0 E. L
  36.     system("pause");) k. q" G/ z! O8 n4 L7 _) D0 p! A
  37.     return 0;. ~. P6 G7 Z% g7 b4 i
  38. }
复制代码
客户端代码:
6 w$ H, k1 a+ _' P  e& B
  1. #include<winsock2.h># V. Y7 [& o: ]4 |2 ?  t
  2. #include<stdio.h>' R: w4 n+ y1 V
  3. #pragma comment(lib, "ws2_32.lib")
    6 [0 h3 n+ g; _; e
  4. void main()
      z* @' L  n8 {2 I& x
  5. {
    - K* X; N9 [$ e6 D
  6.     WSADATA wsaData;( `; S! L/ f9 x5 P$ q  \
  7.     SOCKET sockClient;//客户端Socket) q, V! f3 [# Y( e, Q1 G4 J; r5 O
  8.     SOCKADDR_IN addrServer;//服务端地址
      V! s  @& i( u; E# X0 T7 B
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    8 b, S! H, B. q! ^- s3 w/ \: l
  10.     char message[20] = "HelloSocket!";
    1 R$ q0 j7 @" V1 d. I2 G
  11.     //定义要连接的服务端地址8 V9 N% g7 E* }5 C  u
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)$ [: U& s5 t, T+ m" L' y3 M; ?
  13.     addrServer.sin_family = AF_INET;2 A. |# Y: e) }: F6 V/ @  c( x
  14.     addrServer.sin_port = htons(6000);//连接端口6000* `& E8 w' ^6 d# Y  y% B
  15.     //新建客户端socket  G; r, }3 O; Z% I/ X
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);% O& L1 X, V6 o* ~& A3 n
  17.     int s = 0;
    5 G7 e; @- h: ], S" `5 x
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    , ]7 P) t2 s5 b$ u1 O
  19. ' `3 ^/ ]6 I5 h$ Q! v0 ]! z
  20.     while (1){: R& S, ~& F( Z/ r( R7 D
  21.         //发送数据
    . w6 O7 \3 ~3 R9 b5 y9 X$ u
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    # K1 ~5 T: d- l+ g" N8 z4 [; z
  23.         printf("to server:");$ Y+ ~! I2 z, w. f3 c
  24.         scanf("%s", message);
    ' k, b" z* N7 k* d
  25. $ d7 M6 j  s$ I! y; l; a
  26.     }) `2 S  q, L& ?" I
  27.     //关闭socket1 W5 D- |2 `! L8 `& i
  28.     closesocket(sockClient);
    8 r+ J! u& b# |+ m  ^& k2 [
  29.     WSACleanup();( s4 H. J' Y0 e
  30. }
复制代码
求懂的高手来解答一下。& H* {' @8 P# |" E* W' [
谢谢了!0 u: I% t) J& t( s, R  V4 E; i

$ F3 }  n+ F1 n. L2 ^& [1 v' r0 t6 ^
0 g" w9 V- A& W9 D$ H* N, S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为6 |6 [# |, c# g" ~* G: ?& [
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

GMT+8, 2024-5-18 22:40 , Processed in 0.123712 second(s), 19 queries .

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