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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。- J6 W# [! Z! Q( D
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。! o0 u" f/ i, \; X
Talk is cheak , show me the code.
( j# s6 e1 \- D: ?2 b服务端代码:
; X. w  ~3 p  w* m
  1. #include<stdlib.h>
    3 V1 |* k5 b1 [3 p
  2. #include<WinSock2.h>5 d1 n: S* W4 w$ U
  3. #pragma comment(lib,"ws2_32.lib")
    ) {3 [0 r3 }1 H8 c+ J9 {9 s9 @
  4. int main(){
    . @# _% k+ y4 Y$ G/ l1 [3 r
  5.     WSADATA wsd;
    / e' i5 b/ m. f
  6.     SOCKET sockServer;
    / T4 w( J& M2 C% b5 w% I  U* ~0 s
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号& H: ]; F( s- q7 }. Y# ?, J8 Y
  8.     SOCKET sockClient;
    0 I2 {, [, S3 a" ]* U& d
  9.     SOCKADDR_IN clientaddr;
      c" m7 M! j4 @0 E3 ?# J' G
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    6 }$ p: d' E7 h) @; u, d
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket3 H9 S8 y7 M9 `4 B
  12. 8 ~* X$ ~0 [8 a' R- {, W9 d4 Q* d

  13. % ~# q% d: a( N% o
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){& Y, o: G1 d: Z/ s5 b* U: N/ Z; L
  15.         printf("Socket has been created :%d", sockServer);
    + E3 H5 l+ W1 E% z, j3 r: @7 c
  16.     }/ \2 }. `* y- c: q% `5 E
  17.     else{+ R. s, i. i/ V* B1 V$ P( w$ J
  18.         printf("Socket create failed.");! Y+ x5 }# A% D
  19.         exit(0);
    6 |# y9 I! V- v& w
  20.     }
    & R" Y* I( p6 v. C0 @8 Q2 U
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    9 |) Q2 z7 e2 \$ N
  22.     serveraddr.sin_family = AF_INET;8 E3 A. q/ s% \9 w0 u! p
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000# |  N; T# V8 j
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));8 u' `% S9 k- L6 w
  25.     char recvBuf[100];3 ~. b& _9 S5 G5 ~
  26.     int len = sizeof(SOCKADDR);
    & D8 t5 p; u3 J( Z- u2 S
  27.     listen(sockServer, 5);//5为等待连接数% @8 H  M% T% m
  28.     while (1){% |! Y: w, R; |, [% H8 c
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    0 R5 U& g; p! \7 Q
  30.         //接收客户端数据5 u: E  E. O) J/ p8 ~( |% Z7 s# T
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);' E& J  m/ u( B" s
  32.         printf("to me:%s\n",recvBuf);' w# R. w. y" O1 S4 O& y5 O2 v+ {9 S/ }/ }
  33.         memset(recvBuf, 0, 100);
    9 _+ d  i% e0 q- [2 _
  34.     }# `! A) Y" H# U" ~4 J- |
  35.     closesocket(sockClient);; x$ L) `4 V1 j5 J3 R, r
  36.     system("pause");" S* A3 {! n) [$ I% _
  37.     return 0;* m1 e5 g( x% ?7 O- P
  38. }
复制代码
客户端代码:6 L& M8 h- K3 ]8 S9 e2 e
  1. #include<winsock2.h>4 q9 A+ h/ i5 |( b5 A) g$ U: L% w, K
  2. #include<stdio.h>9 k- e- K# {& |: R# G, {3 ]. m
  3. #pragma comment(lib, "ws2_32.lib")
    0 h$ m6 @2 b, k- Q* H  L
  4. void main()
    5 Z+ G  n/ E$ E, X" m% p
  5. {2 g# L, T) ?- ?. _1 t$ W- x% u
  6.     WSADATA wsaData;
    $ \1 Q# D# K) L3 v8 E
  7.     SOCKET sockClient;//客户端Socket& i, w& F6 o' j( w" c1 j
  8.     SOCKADDR_IN addrServer;//服务端地址
    8 T4 o) W7 T. s1 G9 V3 ^7 _2 j
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);- \2 N& f) B5 J  n; W
  10.     char message[20] = "HelloSocket!";& s. `' B2 e1 `) Y5 r5 e
  11.     //定义要连接的服务端地址& Z0 |- N5 S8 @, n. w3 z
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)7 L6 P4 P& Y. C6 e3 j2 l8 H
  13.     addrServer.sin_family = AF_INET;
    ' f2 E% e/ L) u: h! X
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    * S. g( G0 }: }* E
  15.     //新建客户端socket( e& E% R4 g& }2 A
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);4 n/ U( F0 u: S- L& ^) J
  17.     int s = 0;
    & Z% I+ Z" Q$ C9 D* V' K% i" H
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));2 ]4 R8 a% t  g! u$ e, N
  19. + L' y0 M) I! I7 h, ?) }
  20.     while (1){1 @# o0 \7 y3 T5 U) ~
  21.         //发送数据* K: y9 z* j4 i+ B
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);9 d$ T( L- j" y" n4 p$ T
  23.         printf("to server:");' e7 V. G2 }/ q0 W) ^6 _. Q* g
  24.         scanf("%s", message);
    - u: E& u! T# d7 s8 h5 E
  25. $ X4 S% B4 |* o! Y7 P2 c: L
  26.     }: ?5 @" T- S* D3 ~
  27.     //关闭socket
    ! ~1 C2 y! `1 c) L$ D9 R; f& y
  28.     closesocket(sockClient);
    ( i; V9 g! w. n
  29.     WSACleanup();2 ~3 R& z5 y+ K& P1 B
  30. }
复制代码
求懂的高手来解答一下。  z2 z; E0 v. z; }9 B5 I) g2 h+ @3 `% w
谢谢了!
* L% X$ P( h% i; m

( M" w$ g/ l# J8 M7 T8 q* ~/ X8 f( q/ o7 H+ U0 I% _

& r( |$ q+ z9 D, y! S5 G* ]4 g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为, D. q% O3 i5 r+ H
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-4-30 22:22 , Processed in 0.058894 second(s), 18 queries .

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