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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。/ D) s+ b$ {* [) \
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
2 z  O0 }& e+ yTalk is cheak , show me the code.
: U! N. P( u; l3 K服务端代码:
6 Z; g: Q/ R- W3 c* m" x% U
  1. #include<stdlib.h>* F  N/ l" @* @/ y8 ~  z
  2. #include<WinSock2.h>
    ( ^; X, }) S5 |/ s5 c! [) }
  3. #pragma comment(lib,"ws2_32.lib")
    ; W) Y% r$ |. k
  4. int main(){' v4 X4 U) ~, W3 \8 D
  5.     WSADATA wsd;
    4 W& k) ~0 [. t: Y0 ?) h; d* ~0 {
  6.     SOCKET sockServer;2 d5 t& @" J8 q$ Q( k
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号) V0 x8 [7 c" O! `( z
  8.     SOCKET sockClient;
    4 o8 S7 i& u+ j( l0 y
  9.     SOCKADDR_IN clientaddr;. t1 e9 R/ m6 |, J3 |
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口, i6 D! e. z; X: r9 k3 J4 ~
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket. N, X+ m" h7 |( A9 T
  12. , M" `/ q( O" U7 ]3 ~0 z

  13. : W: x& B: }$ `9 m+ }
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    $ K# f5 B$ @7 f
  15.         printf("Socket has been created :%d", sockServer);
    . i* e, W4 [- i( F4 W) C
  16.     }- v* X3 M  t8 ]5 V" i) B
  17.     else{
    4 p+ \, T4 M8 b
  18.         printf("Socket create failed.");% J. u. y8 b1 V
  19.         exit(0);  G& G2 x) S$ C$ r2 A$ s
  20.     }
    6 v! O$ v/ t# M7 r" L
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    / F! s4 J& ]) z# k6 m
  22.     serveraddr.sin_family = AF_INET;0 T/ q3 D+ s, V7 h8 c; d$ x6 E
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    / s5 Y6 A8 n  A( T
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    / X& R# K; z# t* v0 M4 S0 W+ J
  25.     char recvBuf[100];
    + _9 g9 z1 U4 m3 Z& l5 [+ I
  26.     int len = sizeof(SOCKADDR);, S( J/ ?" U- r0 J" a% q9 m
  27.     listen(sockServer, 5);//5为等待连接数0 s9 f, m: K. m6 B; D
  28.     while (1){
    5 r- E- Q: A  |5 a& p; d
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);% @+ D: c# P, ^+ i+ S2 @7 ~1 s
  30.         //接收客户端数据$ t" u7 R1 i! _+ H" D& ]2 A) G
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    5 ~' l3 G5 W6 K( [+ h
  32.         printf("to me:%s\n",recvBuf);
    # H& U" p1 }! Y3 T
  33.         memset(recvBuf, 0, 100);
    2 M% o  G5 M0 \* M& ?1 C+ F
  34.     }
    ! N, y1 k+ @, j8 ^5 S5 i
  35.     closesocket(sockClient);
    + F0 l( K( m/ _% ~8 q1 @- ^
  36.     system("pause");2 R. z4 |2 c/ G6 o6 G5 E
  37.     return 0;, v% p* o* I+ d1 `
  38. }
复制代码
客户端代码:- M& R. G) x( U4 U: q
  1. #include<winsock2.h>
    8 R' z' X0 z) d, X) L6 j
  2. #include<stdio.h>2 }1 V" Z7 x' p$ }! j  p) k
  3. #pragma comment(lib, "ws2_32.lib")
    2 U7 |/ a0 R2 h0 Q. `" h8 @
  4. void main()/ K, F+ b: i. X7 X" z8 z* }
  5. {
    1 j3 _& L0 i8 ~7 j7 F" u' F2 b* x2 H  P
  6.     WSADATA wsaData;2 [+ s( b; |5 S8 C# ^! [- I
  7.     SOCKET sockClient;//客户端Socket+ T$ X& ^6 [4 W9 {& V, e2 I
  8.     SOCKADDR_IN addrServer;//服务端地址3 p" M2 J  F- d  J
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    / X. R# @/ H- N3 {3 B
  10.     char message[20] = "HelloSocket!";: }: B. |1 ^4 L) {
  11.     //定义要连接的服务端地址
    $ k% L5 h  W6 {& ?9 T7 k5 P
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    ' N' M8 D, r4 C. k8 f, ?
  13.     addrServer.sin_family = AF_INET;9 g% p1 E$ y# T) @. `5 [
  14.     addrServer.sin_port = htons(6000);//连接端口60000 a; }7 u$ E2 e5 [
  15.     //新建客户端socket
    + I& s7 h+ o& V$ |
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    : U: H0 O( E+ x. d* A
  17.     int s = 0;: ?" _# x) D) M8 X0 C6 b9 g, H
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    / ^; g+ F8 z# @* A5 Q3 x: f

  19. ! U( U, M8 n3 a' E7 ^! G! j# N
  20.     while (1){
    : |- p  w1 n* d% d  D
  21.         //发送数据
    5 n- A  U4 x3 A
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);4 `7 W( s2 M0 Y6 b3 N8 d# A
  23.         printf("to server:");
    ( y/ p0 U# N5 L  _; O4 A
  24.         scanf("%s", message);/ F) [$ x, Z& O# N5 g' ~9 i0 d0 F/ }4 H
  25. 6 O1 u5 _* B2 ?* \8 b9 [" {
  26.     }
    ) R: F5 |- O: `7 n) o6 I4 w
  27.     //关闭socket
    4 `' l! e6 _0 J4 e
  28.     closesocket(sockClient);$ \( y4 {! u% E3 l4 T0 W/ k; {
  29.     WSACleanup();1 t3 q; D+ b+ F
  30. }
复制代码
求懂的高手来解答一下。
) `0 O3 }3 a+ H3 A  x谢谢了!" n2 ~  q4 z- j
$ v: o" |6 e: ~4 ^- o6 I
" O2 q0 s% T5 ^2 X( M( {

% M. ^0 Z1 {9 F' T# m. k+ D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

GMT+8, 2024-5-19 04:20 , Processed in 0.161324 second(s), 18 queries .

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