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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。) y* h4 w9 r7 R- H# i9 ^7 N$ U: H* q0 {, b
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。  }: t( X# J( I# Z8 U$ p
Talk is cheak , show me the code.9 [! z8 ]9 ~( H% `, r4 R- [
服务端代码:
" ?4 F7 \# ^4 m0 I- j/ x7 n" v
  1. #include<stdlib.h>
    , q3 p. r& j3 [2 f
  2. #include<WinSock2.h>
    4 P) Z; [' z) w$ J
  3. #pragma comment(lib,"ws2_32.lib")
    ' D' l+ }# s' [& A
  4. int main(){
    7 C. U) ]- r5 O: t  T9 ]: ^
  5.     WSADATA wsd;
    7 q) t% C* M6 k( a8 e
  6.     SOCKET sockServer;0 F6 b0 V$ b! N/ q& j  S/ t; y
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号% ]0 D4 n2 K; \/ I
  8.     SOCKET sockClient;. }' E* V0 [  k- E/ q' u
  9.     SOCKADDR_IN clientaddr;
    * z/ @7 q& r9 n7 Y8 ]1 q. H
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    ( g+ g/ B+ R7 n9 u! W
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket% K0 z6 g  ~& L0 N% G7 w

  12. # ]0 {! T2 U) ?" Q9 Z, Q0 B

  13. " y( V, F" h% Y
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){% \5 @) W$ h4 a$ X7 U
  15.         printf("Socket has been created :%d", sockServer);5 [* U8 f6 o- \' }$ e* o' r
  16.     }. R% x( B$ y3 F. k
  17.     else{; ~2 S- F; D" a/ e* q' X* U. F0 ~
  18.         printf("Socket create failed.");
    4 ~. T1 R1 K; w! ~- ?5 a3 l
  19.         exit(0);0 x4 L- n& m* ^$ G# l3 ~/ H/ M
  20.     }
    & c# D0 v: P9 |0 X) c7 \
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);) G* W- y4 q+ _, k& L9 z
  22.     serveraddr.sin_family = AF_INET;# O4 m2 ^) U9 D6 c9 I) X
  23.     serveraddr.sin_port = htons(6000);//绑定端口60007 H# A3 ?0 k6 b! V# y$ z! L
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    . d0 W7 Z. a* Z* N. _2 t
  25.     char recvBuf[100];
    ; Z" Y1 G5 M2 y7 f' t' g& P% f. I1 e
  26.     int len = sizeof(SOCKADDR);
    3 Y& ?+ u' t/ i0 {# }' I; L+ g
  27.     listen(sockServer, 5);//5为等待连接数
    % V, n& ^( C" E, j5 X
  28.     while (1){
    . \% k  b6 v* w) d- M! k4 L
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);. {  T* }( z/ m. G3 {2 c4 @$ @
  30.         //接收客户端数据; O! X" x  u5 D; o+ S
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);. D3 _$ r8 A% @7 i5 l) p% Y
  32.         printf("to me:%s\n",recvBuf);  r' f# B5 E6 \! ~7 D% f  g
  33.         memset(recvBuf, 0, 100);, O1 N& ~1 q3 s8 D: D: t
  34.     }
    7 z2 ?9 ?! ]" o) w
  35.     closesocket(sockClient);3 S+ |- l0 L1 `* ?/ a/ A
  36.     system("pause");
    - a: r1 E" A' o1 R& D
  37.     return 0;
    6 x8 o1 ]! _5 Y
  38. }
复制代码
客户端代码:
: z6 I) r/ U8 m( G; f
  1. #include<winsock2.h>
    7 R, e8 s  g$ F" A
  2. #include<stdio.h>4 g* s8 Q- x6 D+ T, K$ E  i
  3. #pragma comment(lib, "ws2_32.lib")4 i4 x. D* L3 X* V% y3 O, o
  4. void main()
    $ D- W+ p$ x/ V& j
  5. {; B3 k, A1 C8 k
  6.     WSADATA wsaData;
    1 T2 x1 }0 j' s& T
  7.     SOCKET sockClient;//客户端Socket
    - @4 g) w3 M  H+ u. q' n
  8.     SOCKADDR_IN addrServer;//服务端地址$ J/ Y4 D( p2 G
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);3 U) e# E+ j; m( o7 @1 A
  10.     char message[20] = "HelloSocket!";. a3 G2 ?2 G/ g: ~
  11.     //定义要连接的服务端地址
    * S! R, `) E. l  {5 i; ?: L7 F  b3 \
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)% l, Q+ l1 z/ L0 s0 W
  13.     addrServer.sin_family = AF_INET;5 }$ o- {' a& ^4 P
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    0 h. j# a9 _0 }5 @: I
  15.     //新建客户端socket/ I: r8 L4 }; s6 t  N$ q% h& z' n, z
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);. p9 z$ b$ X- e3 }
  17.     int s = 0;; V3 z/ M0 X, A* b! {& z9 c4 }* b
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    # G9 l* G) y5 Y" @6 ^

  19. , T" ^. M1 y- x7 U3 i. C0 d( c# m
  20.     while (1){, D0 x$ B! S1 ~: c: h
  21.         //发送数据( z+ F6 \! J, E* k
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);# X! f; R4 p/ r4 {
  23.         printf("to server:");
    / n  ]+ d: F( b) |
  24.         scanf("%s", message);
    . n1 e2 s* T0 m3 R: Y4 P5 m0 Y

  25. 5 h% ^. u: U( i! m
  26.     }. _) P7 @' n) Z! W, I/ E! d
  27.     //关闭socket1 ^: u" Z$ F8 u: W8 w0 S5 g
  28.     closesocket(sockClient);) E' b  ~1 d6 D& r6 n
  29.     WSACleanup();# [! Y2 `/ J( o- \$ J0 \
  30. }
复制代码
求懂的高手来解答一下。
: T1 z$ l8 v+ ]+ t谢谢了!
( F2 a# a/ Z7 p- R! W6 Y
7 E$ ]5 M  N7 @
# T7 t% E" N. f: C  f( D
9 v9 @. Y: S8 i. f
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
" O/ N. x8 G$ m1 orecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-1-30 14:56 , Processed in 0.074843 second(s), 19 queries .

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