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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
1 z5 Z0 R3 E! d$ J3 B7 J, N我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
& o, w, q3 d8 t7 S) L. h8 F- wTalk is cheak , show me the code.' H; _1 B% D7 A  f* l3 F9 M
服务端代码:
1 ~" w5 l% \: a) H2 X5 {, F5 Z1 q
  1. #include<stdlib.h>
    ( w4 h! h: R! w/ s1 K! W
  2. #include<WinSock2.h>
    1 G- g3 a. Z9 U% c( x7 r( e/ q$ D
  3. #pragma comment(lib,"ws2_32.lib")) D7 A4 e; F: W+ x
  4. int main(){; I$ E  m, e' E8 c/ `2 u; t
  5.     WSADATA wsd;
    1 h2 l' M; }, S5 R: k0 I! w
  6.     SOCKET sockServer;
    . K$ p: B' o' ^# r* x
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    3 [4 s, S7 t( _) Y  Z+ m
  8.     SOCKET sockClient;2 t# o- }' c9 U
  9.     SOCKADDR_IN clientaddr;; b9 \; ]5 o0 g; m
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口1 K. \& f/ y0 J* T0 ?0 Q  q/ A* w
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    ' ]" ?/ s$ C$ ^9 m3 u

  12. . @5 f+ ]/ e5 a$ Q9 x# ~6 S

  13. 2 m3 @; N2 [4 z* C
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){. A/ N! r9 p8 C1 o" U7 z
  15.         printf("Socket has been created :%d", sockServer);. I5 V( ~+ D: e; T# x
  16.     }
    % A. L9 U& x& {1 E  d5 ]
  17.     else{" |8 A0 i. M- f) U7 C
  18.         printf("Socket create failed.");
    8 q7 B; c/ R  M& @; s
  19.         exit(0);
    # _+ m/ m2 o, S: d4 ?
  20.     }
    . A9 Z* C6 z0 N8 Q/ l/ D, v
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    3 m' N4 U5 p- z6 Z
  22.     serveraddr.sin_family = AF_INET;
    / G; F5 M& v2 d9 d* T- {" g* |
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000$ b- l9 D' |/ v  B
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    & ?* q0 p6 A7 I; g" T; n
  25.     char recvBuf[100];
    * y0 f" |5 B" H/ ^
  26.     int len = sizeof(SOCKADDR);
    . Q4 C5 V& M+ v7 Y: }
  27.     listen(sockServer, 5);//5为等待连接数
    $ f4 p3 p( b; x8 F' E
  28.     while (1){
    ( V* @2 a8 f% @; Q+ A
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    8 [1 d, i7 o: `0 Z% W8 P
  30.         //接收客户端数据6 `% g) e, O* s% i# m) I# W
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);" b. V, k! T' P" c* T: \! h' ]3 n
  32.         printf("to me:%s\n",recvBuf);( r2 s& I9 d9 R9 n  P
  33.         memset(recvBuf, 0, 100);4 Q& s2 K8 M* j" \. L
  34.     }) w  ~2 g9 r# G5 _4 H5 A: b% |) v* c
  35.     closesocket(sockClient);% x/ _! m) w( L7 y2 C
  36.     system("pause");, g: @: ?" o7 K7 U, y( u
  37.     return 0;+ I- p, }$ l7 w2 t1 t$ x! p
  38. }
复制代码
客户端代码:0 Z" a$ E5 k7 ~0 e. W: M# {3 i& E: }- ^) D
  1. #include<winsock2.h>, A$ G, b% ^/ z
  2. #include<stdio.h>
    & C* W. i9 K- z! d5 M( M: D
  3. #pragma comment(lib, "ws2_32.lib")
    / y( B$ X+ N0 K
  4. void main()
    ! ^' X1 c! z6 h/ D3 n
  5. {
    + U' E" }$ K% c# n% u! y9 ^8 ]
  6.     WSADATA wsaData;% L' t! c/ t# P
  7.     SOCKET sockClient;//客户端Socket
    9 V! [, @2 m, b1 Y. Z- J1 Q) k( t
  8.     SOCKADDR_IN addrServer;//服务端地址( _: i4 ^, j. i( ~" X
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);. H1 [7 |. M% R+ u
  10.     char message[20] = "HelloSocket!";$ t$ F5 h% ]8 u
  11.     //定义要连接的服务端地址* R& z9 J8 q# {' g" E* B4 c( k4 t
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)& }# ]- {1 Y0 m4 h7 @
  13.     addrServer.sin_family = AF_INET;* A: e0 u" ?) X; h: g7 c# t
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    & ^+ _/ P7 G9 B5 [' Y2 {
  15.     //新建客户端socket/ a# T2 s* J8 u& {8 I1 @
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);- D% m6 {2 o3 b1 b0 x/ {
  17.     int s = 0;
    " ]+ R9 w3 v, \. R3 X; `
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));& x* U/ B% h! ]5 X
  19. " \* C! H% _5 l& G- b; L8 u
  20.     while (1){
    . z  o, g; P" \5 S/ M) y9 E
  21.         //发送数据
    2 D: L, c" V3 M1 Y* \$ P! t
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);1 N  a4 W% F+ d( U1 o
  23.         printf("to server:");
      ~( M# ?' n4 [) @9 q4 ]
  24.         scanf("%s", message);8 }8 N& Y+ [' h5 m& S
  25. 9 s- v5 `# z0 E5 O
  26.     }  i/ h4 y# `8 t, ?$ Y
  27.     //关闭socket
    " S/ N. H3 Q) ^$ W1 `* J' W5 r5 ^! g
  28.     closesocket(sockClient);% u9 F4 T! {% e. i
  29.     WSACleanup();
    ; r  R1 ~0 t$ L+ h8 U& b
  30. }
复制代码
求懂的高手来解答一下。( t2 L: m' z6 {$ b
谢谢了!
! A3 q  x4 U9 s; v2 k$ }1 d! t
4 J6 f8 b! y& w+ z

7 \/ [% O$ C1 @: K0 k
9 ^/ R$ V8 X* r" }+ O4 P
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
  f# c+ [1 `) U  d% Drecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2024-5-20 10:58 , Processed in 0.103040 second(s), 18 queries .

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