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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
; a1 g5 Y7 Y4 I我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
: u& E4 r% z, [5 {6 ^2 hTalk is cheak , show me the code.
5 t/ {' P' [- [, I6 ^$ Q  v7 A* f服务端代码:
' ?" O# f) X; W  ]% J9 k0 [
  1. #include<stdlib.h>
    7 o9 j- P0 V* _
  2. #include<WinSock2.h>. S& M" L) ]% z
  3. #pragma comment(lib,"ws2_32.lib"), p& D: |" h& }
  4. int main(){
    4 A. x2 p+ I3 [! p- E) ?* W* }& j
  5.     WSADATA wsd;, c$ J. ~3 X, f# W5 Z7 ]
  6.     SOCKET sockServer;( a8 T& g: D8 Y
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    4 V3 g3 S1 Q4 E$ M7 V$ j5 {7 m
  8.     SOCKET sockClient;2 b. z9 k0 y$ F( x" {9 P
  9.     SOCKADDR_IN clientaddr;# i1 }$ t" C9 g, y  T, B! O
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    4 n3 ?5 N2 C7 {+ w* C6 v
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    7 ~" z" F1 s: K: C: Y! j

  12. 9 i; T: h$ I7 H, X  g6 l  L
  13. 3 S0 V0 M" t3 \. B! I1 w
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){: N5 _6 B7 I- i, }3 L3 x
  15.         printf("Socket has been created :%d", sockServer);
    ) q# j: d3 ?. V' m' T/ S
  16.     }
    7 B( @" ~* q8 \6 n4 Q
  17.     else{
    2 T/ a* G0 G6 u. e& q: T
  18.         printf("Socket create failed.");5 U" w/ G1 D8 K- v' c7 j7 C4 K
  19.         exit(0);' n5 W  N4 ~/ ~+ {
  20.     }1 g/ t- n6 U# D, ^1 B6 b$ D( q- w' g
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    1 Z6 k2 U: O% u
  22.     serveraddr.sin_family = AF_INET;
    9 C- |6 D! t5 t8 [2 |
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    " c, H* I/ r8 I! K3 S/ ^8 s6 Y9 i1 P
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));5 t  r/ c, n. l, P' ~  n2 B
  25.     char recvBuf[100];
    3 |1 a8 ^! v8 k; q; a
  26.     int len = sizeof(SOCKADDR);% r- Y; U( ^0 ]4 C7 B+ ]
  27.     listen(sockServer, 5);//5为等待连接数4 T! `! \) c% n7 \, ?: F8 x- ^
  28.     while (1){; ~3 G5 s* X3 J. t# t* V) ?1 C1 }
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    ( D4 B4 }7 ~5 a  T3 T
  30.         //接收客户端数据
    + Y  }( C$ K" F6 Y" M
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);$ t$ ~) r4 J) G! ?  C8 d
  32.         printf("to me:%s\n",recvBuf);) v; e9 T9 L8 w3 d5 e+ J) G! g3 H
  33.         memset(recvBuf, 0, 100);
    & F, m5 }- s0 u; R9 I4 ^2 Z" W
  34.     }
    ( R# F9 }6 l+ y  ~5 \( t4 @
  35.     closesocket(sockClient);
    " B) W# ~5 V# F# J
  36.     system("pause");
    / ^8 p  H& U# W* a# [
  37.     return 0;* Y- a, m' r+ H4 A+ \$ E
  38. }
复制代码
客户端代码:. s: L) f# Q6 W1 B. V
  1. #include<winsock2.h>
    % m# X/ e# p5 ^7 x
  2. #include<stdio.h>
    ! {. o" F$ l" b: d( l8 ~
  3. #pragma comment(lib, "ws2_32.lib")
    , r. `$ ]9 C/ c' x9 @0 s' J* y
  4. void main()( ^# Q4 y  J# }& t# B! o, U+ k
  5. {
    3 x# ^0 x* |  g) c
  6.     WSADATA wsaData;
    2 v$ p5 Q* Z, _
  7.     SOCKET sockClient;//客户端Socket7 |9 z& z3 c0 U1 W! f$ u
  8.     SOCKADDR_IN addrServer;//服务端地址& P6 O8 t/ ^. y5 k: ~: u4 {
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);& M! Y. V2 R2 B4 o6 o: A+ Q
  10.     char message[20] = "HelloSocket!";" @. J5 E: ?5 k
  11.     //定义要连接的服务端地址/ t1 m6 _; M/ ]5 m7 g/ q2 w
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    $ ?# A3 Z" Y7 X1 y7 ^+ @# h2 L
  13.     addrServer.sin_family = AF_INET;' r& G' w  s& z" T; K8 B$ ^( _9 Z9 a
  14.     addrServer.sin_port = htons(6000);//连接端口6000: J3 a# H- a+ @4 R+ f
  15.     //新建客户端socket
    . F- o  a6 W! E8 P1 y$ h' U
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);) j$ \9 s2 O+ o( {2 v: [9 Q
  17.     int s = 0;
    . f, L8 b- m  S% o8 A/ v- ]
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));/ K; p2 g$ {" V  }

  19. % f9 |! n" Y2 @
  20.     while (1){
    7 N  o) @8 {1 ?3 c4 ]0 r; k
  21.         //发送数据
    6 d4 v* c! t+ l$ a: Y0 \. g* Z0 D+ o
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);- n$ Z; g, X/ V/ w) \& \9 C1 G
  23.         printf("to server:");
    * b+ @8 j1 c8 V- Y9 Y  B8 X5 C7 U
  24.         scanf("%s", message);. q' q0 ~" L2 g' S" m' e7 I* ^
  25. - r. U$ s6 V+ }) b
  26.     }- }$ l" T2 T( v1 L. l
  27.     //关闭socket
    $ \) m* v. U7 n6 `
  28.     closesocket(sockClient);
    ) |! V' P2 B& t+ t$ y
  29.     WSACleanup();4 a! @/ x+ B7 A5 A
  30. }
复制代码
求懂的高手来解答一下。# P# E& x% S  T. ]
谢谢了!- y% \5 M4 [, v# J1 I

' q& j0 Q0 Q* o2 ?3 i- T
3 {7 H' Q9 K5 e/ e8 R( ~. M+ y: ?  ?# ]9 D7 G7 ?/ K
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为0 F- E) h5 K% d& ]7 O4 A. a
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2024-5-18 16:14 , Processed in 0.150972 second(s), 18 queries .

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