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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
5 G9 j3 M0 R  U1 t我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。- K1 q: c. r) f6 n6 c& h; u
Talk is cheak , show me the code.
* D; c! U/ a" ]' W; }服务端代码:; S; X) [4 E% m) h+ `$ b+ `
  1. #include<stdlib.h>
    : d4 ~5 g3 A5 G  I. |
  2. #include<WinSock2.h>
    ! u6 @$ F% ^" E% X+ w* z
  3. #pragma comment(lib,"ws2_32.lib")
    1 d! ^( a" r  a5 E# g1 \) a
  4. int main(){5 m% F5 ?" j7 C7 I' G
  5.     WSADATA wsd;
    4 A/ ~" [  e/ `# I- U5 V
  6.     SOCKET sockServer;( E' `$ s# c( y' C
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    + Z* V8 [: Z) J6 q/ x3 l
  8.     SOCKET sockClient;5 K( R2 f1 C' J& r
  9.     SOCKADDR_IN clientaddr;
    3 t, I+ |9 \9 K# U6 S4 l9 b
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    5 e3 o- y3 ~) i" r
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    ) T" a+ R* q" T3 h2 c* k3 j2 J, b5 s

  12. 8 x7 P$ Y2 @/ C+ E: a
  13. 3 Z/ o( M. t) {7 m
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){# R8 D6 _, A+ L. i
  15.         printf("Socket has been created :%d", sockServer);6 r; U5 Q* g; c) g  }9 T
  16.     }
    ! l" Y4 d5 k# ~# Y# g. _4 A# S: \
  17.     else{
    / {" X, ~0 Q. Z0 ~
  18.         printf("Socket create failed.");
    # _6 @1 u4 J6 O- A" E0 |5 X4 ~. \
  19.         exit(0);
    6 z7 }7 W0 z1 h8 w8 S
  20.     }
    * Z# w1 j6 j, Y' x- c) h) g
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    . S3 g$ i4 D- n# n  |" m: t/ q5 f( j+ i) Z
  22.     serveraddr.sin_family = AF_INET;
    7 A5 O! `  ^6 a( p
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000# O7 q/ S( Z: }- i
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    $ `$ M) J+ o; ]5 g2 M' a9 I
  25.     char recvBuf[100];
    2 g/ Y2 r' W! R/ n; g. M! ~
  26.     int len = sizeof(SOCKADDR);. j+ |( f- f2 \/ f" g
  27.     listen(sockServer, 5);//5为等待连接数
    0 Z9 h4 N& M( n, ?* W. D
  28.     while (1){
    3 y( [' ?  C- H
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);9 n1 }- a7 Y# m
  30.         //接收客户端数据
    2 @- A! D. o( s/ s2 z- u0 _
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    4 e* t& `: R& u
  32.         printf("to me:%s\n",recvBuf);
    8 ]+ @0 r1 S. z2 {2 A" e7 N9 H
  33.         memset(recvBuf, 0, 100);5 A% B; _4 g1 p( h! W
  34.     }
    1 S2 N6 b, P0 E4 f. U5 }6 T
  35.     closesocket(sockClient);
    + h2 R: v& b/ u( C. L
  36.     system("pause");
    # Z9 h  C" G7 z( T$ t4 f
  37.     return 0;  G0 Z: Y& U4 z% S' r
  38. }
复制代码
客户端代码:
8 ]0 }$ `9 m0 k% U3 [+ x
  1. #include<winsock2.h>
    ( y" U. B( T8 e1 R  ^8 P
  2. #include<stdio.h>
    2 p* h! q3 G, {2 n
  3. #pragma comment(lib, "ws2_32.lib")
    ( N/ g# K$ R. `+ R0 h- |
  4. void main()
    + O7 p! E* w* l7 k% f+ @+ i
  5. {+ E9 n  o& m& p5 V; a
  6.     WSADATA wsaData;
    1 E7 X6 v5 q% _5 B
  7.     SOCKET sockClient;//客户端Socket" y9 T: u7 s1 z9 ^* m) k
  8.     SOCKADDR_IN addrServer;//服务端地址2 k: s2 s, ^7 V3 m
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);, p  n+ A# A- y/ y: N7 R0 |' w
  10.     char message[20] = "HelloSocket!";8 m* M# _! F6 r% ~  t$ G- ]
  11.     //定义要连接的服务端地址
    ! {) }2 e% g% l) Y
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)# o) l* `4 W6 m6 a- I  C
  13.     addrServer.sin_family = AF_INET;
    8 B, _3 x3 P5 M7 r1 q2 y, X  Y
  14.     addrServer.sin_port = htons(6000);//连接端口6000( E2 R2 ?& J8 c
  15.     //新建客户端socket
    . S" i6 u$ G. K" `9 @" G- z8 `: I8 p
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);* h* }6 C- i( o' T( ^
  17.     int s = 0;
    % P* g! r4 f) N7 W' V6 z. s% a$ h
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));9 C# {; y- }% o  t
  19. 7 g  m  F# K; ~9 z' |$ H8 _8 P" O
  20.     while (1){. s  h0 f; D& c  I( o% e
  21.         //发送数据8 c; S7 ]2 S0 R
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    5 |8 O* E; U7 E
  23.         printf("to server:");
    # |- p8 V  B5 [$ E; p. d
  24.         scanf("%s", message);
    8 O( d5 k& K: o4 x7 o; A
  25. / s/ }$ E% W/ ]5 h( N! I
  26.     }2 v: M( c* K- ]% @% C7 `
  27.     //关闭socket
    0 @) a6 O! w" @: Y$ _6 h" C3 z
  28.     closesocket(sockClient);8 G. W4 l( e/ ~0 }  V
  29.     WSACleanup();/ a% V( k$ [4 d, \
  30. }
复制代码
求懂的高手来解答一下。$ M: |) a- A% n  ^6 Q4 W& t% Y
谢谢了!( a6 C6 }8 b& S& C2 _0 s* u

8 E' k7 H6 S8 J2 ?. _5 q8 H- @( @) |! D7 w* R

$ X; s- f! L! B8 y4 w- J3 R
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
# u- ~& B  d8 }' J. ~. srecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-8-4 10:04 , Processed in 0.058160 second(s), 18 queries .

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