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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。( a  L% b- a5 [, x  G- ]! k
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。8 W2 P2 E0 t7 ?% l3 N3 e- v) [
Talk is cheak , show me the code.5 l, F( l$ F8 n% g: `" k4 e
服务端代码:
$ Z: k$ T# _7 ]; [" W: T
  1. #include<stdlib.h>3 N! u( `) [! H! `' Y
  2. #include<WinSock2.h>5 g% G- E) {" D( R  Q) A, G( {
  3. #pragma comment(lib,"ws2_32.lib")
    0 e5 w" ^7 r- Z2 m7 d  K
  4. int main(){% s2 l; x6 E- Y  a# E
  5.     WSADATA wsd;% s/ _. B+ Q" {
  6.     SOCKET sockServer;
    , X8 E$ v; h7 O" x
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    5 m4 e, X; s0 W5 z+ e: \4 \3 d. }: c
  8.     SOCKET sockClient;  G4 e* o6 u/ c4 |  X, R! b; z& D
  9.     SOCKADDR_IN clientaddr;
    % B" m0 r6 T7 _. S
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口  g, m, Z3 E" Q( ^: L6 Q: Q
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket+ ]9 Z5 X: n: H9 }

  12. & `& k% d% \# r: z5 s! C7 v5 U

  13. & v1 I6 m) ]# ?1 x
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){$ o; ^7 N+ f8 P
  15.         printf("Socket has been created :%d", sockServer);0 W4 @; y( J8 [% S/ \
  16.     }
    5 \1 I6 q/ x0 l$ w! O0 }) n( i
  17.     else{
    " p$ c% ~+ _8 |
  18.         printf("Socket create failed.");
    % o' K% U, i5 r0 ?1 D/ ]6 Q2 j/ q
  19.         exit(0);7 ?- I( g- q- G  g! c: Q( ?
  20.     }& |4 O1 E8 O* p* \0 H3 ^4 w
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    7 a% V  p: f7 i
  22.     serveraddr.sin_family = AF_INET;
    # ?+ M+ I" v, u
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    / C5 a% C) ~5 Y3 r5 A
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    ) l# G4 K0 M# f4 f8 O2 }& a
  25.     char recvBuf[100];
    # {+ ~. l5 x3 _' f
  26.     int len = sizeof(SOCKADDR);* g. n5 J9 X; F% w" {1 K
  27.     listen(sockServer, 5);//5为等待连接数
    5 Q6 j+ \- b% G8 K$ H* S* B% R) T
  28.     while (1){
    9 ^/ v+ N8 a$ J
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    ! ~: j3 s8 ~$ R- _! p/ V4 C
  30.         //接收客户端数据
    7 y' W  H  |7 n3 T2 B3 A
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    # V8 P' P, C5 ?% `6 n
  32.         printf("to me:%s\n",recvBuf);, L! w( K) v) ]; {% W: P' w* r
  33.         memset(recvBuf, 0, 100);
    ( e6 j) O1 @( J) ~; k, o! Q6 u6 E8 I; H8 g
  34.     }
    # m" j# |& t$ v; u- R. [
  35.     closesocket(sockClient);8 [3 O7 `, e/ N" E( \+ G' k3 A7 x+ P
  36.     system("pause");. o) h. K. O+ m% p. ?! q3 G
  37.     return 0;. f, W: E; t& l2 f
  38. }
复制代码
客户端代码:" a% |& B8 _" R. \* n6 W1 e
  1. #include<winsock2.h>
    5 x  V4 m3 D# [8 L
  2. #include<stdio.h>
    8 q, t. A- m4 k" v) w2 X
  3. #pragma comment(lib, "ws2_32.lib")9 b3 M% t  l9 L; k/ }* b# `
  4. void main()' [* Y( q: a) X0 ^
  5. {3 ?% p# W1 L7 N' r8 F0 ^( ?
  6.     WSADATA wsaData;
    4 d8 v- \. u% ]+ \% G% c: W
  7.     SOCKET sockClient;//客户端Socket
    ( _- N* i0 u1 z
  8.     SOCKADDR_IN addrServer;//服务端地址
    + o; U' W9 }' e- n9 E
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);; x9 H$ o  E0 g# ~
  10.     char message[20] = "HelloSocket!";8 I0 ~: T; D3 S+ M: g
  11.     //定义要连接的服务端地址: W! d0 v5 C& O0 S4 C4 M: m
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    ! ~# Q- ~2 @+ H, E7 H) J4 l
  13.     addrServer.sin_family = AF_INET;! c* i: j7 Y) N
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    ' ^6 U; {* c4 Q, X, P
  15.     //新建客户端socket
    " V7 |  K* A: w$ ~
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);  c( H, E9 e3 K! s7 z+ i' k
  17.     int s = 0;/ s# I# @" f$ f# N
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));* A; o2 W4 w0 ~/ i8 \
  19. 9 n$ H9 U; T3 Q; U& `2 Z. W+ X$ s
  20.     while (1){4 s  j# ~+ B; ^8 r& s" q7 ]
  21.         //发送数据0 [! {$ `: ?+ T4 [# n
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);8 z8 B* J: _6 E- J
  23.         printf("to server:");
    7 X( C4 U3 p% ~
  24.         scanf("%s", message);1 Z# |- o0 S: ]. \

  25. " N* Q* k6 M* g* T
  26.     }
    , a* S. z" Q4 c% |: t. K1 C
  27.     //关闭socket& N, R4 k' y0 n/ f. q
  28.     closesocket(sockClient);+ d6 [' O+ u# h6 y
  29.     WSACleanup();
    : R, [: x: O2 Z; t5 W
  30. }
复制代码
求懂的高手来解答一下。
  N* M1 C, R0 N) `" Y谢谢了!
* P" _& u% i6 N( A9 [' L& Z( y2 [& p

# l/ R* h% x& |( Y. B& [% T. k3 ?/ d
3 c  ]0 g! w, Q5 B, Z4 w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

GMT+8, 2026-5-2 11:47 , Processed in 0.056858 second(s), 19 queries .

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