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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
- W. v  _2 Y9 w8 |2 Y, G我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
8 k! {; e. f% d( u$ T$ h, ~Talk is cheak , show me the code.
- C, N7 l* {+ ^( \6 ]6 Q服务端代码:( @  P! ?8 Z& r1 ?2 J
  1. #include<stdlib.h>" \# Z8 z" V( W
  2. #include<WinSock2.h>  q' `/ G6 d* |2 E; o" s; q
  3. #pragma comment(lib,"ws2_32.lib")# w( E, B! U' h
  4. int main(){" n7 {7 g9 N( @  K3 a' D* V
  5.     WSADATA wsd;& U( i$ F! ~4 y' d" ]' i" a% u
  6.     SOCKET sockServer;# l0 U$ L3 s6 E/ _/ e* [0 q
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    3 G8 w) E1 ^3 L& ^& A! j& H5 `
  8.     SOCKET sockClient;  M( L1 X1 X8 Z; L9 |6 {
  9.     SOCKADDR_IN clientaddr;7 ?3 Q. J# X* l- B
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    6 t6 i) v5 T! \
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket8 Y% x  @/ J6 j, g
  12. & e. L4 F! w5 s# Y! O& ?

  13. , d8 V, v8 n5 M; M
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    3 D, ]2 @+ C& E9 G$ [
  15.         printf("Socket has been created :%d", sockServer);( s/ @  c* b4 l' T! k
  16.     }
    " C8 W# B: u+ `3 r5 i
  17.     else{4 X- L# y* A) A( }! B9 r. z% e
  18.         printf("Socket create failed.");+ X% ^: J. D! I4 R- g
  19.         exit(0);
    0 [" q0 `, [/ b1 Y! k- h& g
  20.     }
    7 l0 [! X' Y6 n4 W
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    + c+ F- N+ X: P
  22.     serveraddr.sin_family = AF_INET;
      Z1 o7 n  z# J
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    + ]) _1 I  i+ O8 ^& {9 M( e) y
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));( H& ]" S8 e9 w2 J: E
  25.     char recvBuf[100];0 U5 w( i7 [) h& Z
  26.     int len = sizeof(SOCKADDR);7 J' b4 O# w' W) Z' S( b
  27.     listen(sockServer, 5);//5为等待连接数
    * U. u/ d0 ~4 w# ^3 T
  28.     while (1){
    2 I- U$ M$ H$ U) x2 b3 w, `3 N
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);# V" p; U( e  X& O) e7 T. ?5 J4 _" }
  30.         //接收客户端数据
    7 [6 j! ~; T/ ?/ ]5 v5 G
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);  i! q, ?9 h5 V( F# U
  32.         printf("to me:%s\n",recvBuf);! ~/ U% v  j* l  N4 a
  33.         memset(recvBuf, 0, 100);# O4 d5 U1 ]+ g- V8 z, A8 l
  34.     }
    , B4 x# z5 J+ V1 O( x
  35.     closesocket(sockClient);; A' S# a9 C" x1 q! H
  36.     system("pause");
    ) u6 o4 ?4 O/ s3 J9 y0 t
  37.     return 0;2 K0 ?% B% H3 {0 E2 G" }
  38. }
复制代码
客户端代码:
2 W, A4 P! W. W/ r: l
  1. #include<winsock2.h>
    1 r8 k7 Z! J1 g
  2. #include<stdio.h>
    8 v: f6 Q9 N7 B1 F: w) y3 I4 y
  3. #pragma comment(lib, "ws2_32.lib")4 I7 ^3 P" A& C# y! G
  4. void main()
    8 ~  i) J: _1 r! O; E' W( q
  5. {& ?( A3 C% o/ H' q
  6.     WSADATA wsaData;& ~" i5 k( b, p7 w5 Z, Y
  7.     SOCKET sockClient;//客户端Socket! W/ t1 y( R% W& l9 A* N0 E
  8.     SOCKADDR_IN addrServer;//服务端地址3 @+ H& Q+ L5 D2 i/ ~; A5 R% K7 b
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);$ b. C* [( c' r7 a
  10.     char message[20] = "HelloSocket!";
    3 _' [. |4 `2 |) W( B  |* G
  11.     //定义要连接的服务端地址
    8 N- L; v7 W$ \) A. t
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    ; {( t  N/ q7 m" A; T+ y
  13.     addrServer.sin_family = AF_INET;
    $ P, |$ @3 A0 y
  14.     addrServer.sin_port = htons(6000);//连接端口60008 E$ {- N% ~! h% d1 b
  15.     //新建客户端socket+ \9 r2 W9 P; e7 k* ?2 Q
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);# i8 R( J  t6 p% x0 M' F
  17.     int s = 0;- `( H+ Q& g" _9 j/ Q3 P0 j
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));) d2 Q4 Q( c1 n7 N
  19. * b/ L2 v; p" d0 a
  20.     while (1){
    & [9 A7 V. H" z8 y% _+ r5 L' ?
  21.         //发送数据
    8 l- y0 |6 C5 o8 y" K
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);5 s( e5 }5 |! w: O
  23.         printf("to server:");
    # F# i3 T; d, D( |8 Y; ^
  24.         scanf("%s", message);# g6 `. T0 }( @# a  z3 l' r' l

  25. # J6 t* Z5 [3 D' I
  26.     }
    3 Q) l$ K$ ~6 B* ~/ d& f/ }
  27.     //关闭socket
    ( {: c/ _5 L; g
  28.     closesocket(sockClient);
    4 E: m, U6 M& o! ~( c) Q+ s
  29.     WSACleanup();
    6 q+ `% Z  W3 @8 S9 B, f# G. N1 L
  30. }
复制代码
求懂的高手来解答一下。
* I9 d# x! _4 o8 L谢谢了!9 ^3 f5 Q* T9 \0 o9 w9 \! M3 J
+ O5 {7 C) m0 o/ l
3 G7 |. s, I. z" F0 `( U/ l# U- \' X
8 Q1 a3 B( o7 Q% Q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
' H4 C8 _3 u3 s: Qrecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-6-20 01:10 , Processed in 0.054548 second(s), 20 queries .

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