发送带有多个数字的字符串客户端/服务器TCP
我正在使用C语言进行TCP客户机/服务器通信。客户机必须获取数据的数量(而不是>6),获取数据并将它们以单字符串消息的形式发送到服务器,如下所示:4 11 21 9 11。 4是数据的数量,11、21、9、11是数据 然后,服务器必须读取消息,打印它并将接收到的数据数(4)发送给客户端 我为客户试过这个:发送带有多个数字的字符串客户端/服务器TCP,c,tcp,server,client,C,Tcp,Server,Client,我正在使用C语言进行TCP客户机/服务器通信。客户机必须获取数据的数量(而不是>6),获取数据并将它们以单字符串消息的形式发送到服务器,如下所示:4 11 21 9 11。 4是数据的数量,11、21、9、11是数据 然后,服务器必须读取消息,打印它并将接收到的数据数(4)发送给客户端 我为客户试过这个: #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #in
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
int main(int argc, char *argv[]) {
int simpleSocket = 0;
int simplePort = 0;
int returnStatus= 0;
char buffsend[256];
char buffrecv[256];
int n, i;
struct sockaddr_in simpleServer;
if (3 != argc) {
fprintf(stderr, "Usage: %s <server> <port>\n", argv[0]);
exit(1);
}
/* create a streaming socket */
simpleSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (simpleSocket == -1) {
fprintf(stderr, "Could not create a socket!\n");
exit(1);
}
else {
fprintf(stderr, "Socket created!\n");
}
/* retrieve the port number for connecting */
simplePort = atoi(argv[2]);
/* setup the address structure */
/* use the IP address sent as an argument for the server address */
//bzero(&simpleServer, sizeof(simpleServer));
memset(&simpleServer, '\0', sizeof(simpleServer));
simpleServer.sin_family = AF_INET;
//inet_addr(argv[2], &simpleServer.sin_addr.s_addr);
simpleServer.sin_addr.s_addr=inet_addr(argv[1]);
simpleServer.sin_port = htons(simplePort);
/* connect to the address and port with our socket */
returnStatus = connect(simpleSocket, (struct sockaddr *)&simpleServer, sizeof(simpleServer));
if (returnStatus == 0) {
fprintf(stderr, "Connect successful!\n");
}
else {
fprintf(stderr, "Could not connect to address!\n");
close(simpleSocket);
exit(1);
}
/* get the message from the server */
do {
printf("get numb of data or terminate(write '0'): ");
fgets(buffsend,256,stdin);
n=atoi(buffsend);
if(n>6) {
printf("Error\n");
}
else {
for(i=0;i<n;i++) {
printf("insert number: ");
fgets(buffsend,256,stdin);
write(simpleSocket, buffsend, strlen(buffsend)+1);
}
} while((n!=0) && (n>0));
close(simpleSocket);
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[]){
int simpleSocket=0;
int simplePort=0;
int returnStatus=0;
char-buffsend[256];
char-buffrecv[256];
int n,i;
simpleServer中的结构sockaddr_;
如果(3!=argc){
fprintf(stderr,“用法:%s\n”,argv[0]);
出口(1);
}
/*创建流式套接字*/
simpleSocket=socket(AF_INET、SOCK_STREAM、IPPROTO_TCP);
if(simpleScocket==-1){
fprintf(stderr,“无法创建套接字!\n”);
出口(1);
}
否则{
fprintf(stderr,“已创建套接字!\n”);
}
/*检索用于连接的端口号*/
simplePort=atoi(argv[2]);
/*设置地址结构*/
/*使用发送的IP地址作为服务器地址的参数*/
//bzero(&simpleServer,sizeof(simpleServer));
memset(&simpleServer,'\0',sizeof(simpleServer));
simpleServer.sin_family=AF_INET;
//inet_addr(argv[2],&simpleServer.sin_addr.s_addr);
simpleServer.sin_addr.s_addr=inet_addr(argv[1]);
simpleServer.sin_port=htons(simplePort);
/*使用套接字连接到地址和端口*/
returnStatus=connect(simpleSocket,(struct sockaddr*)&simpleServer,sizeof(simpleServer));
如果(返回状态==0){
fprintf(标准“连接成功!\n”);
}
否则{
fprintf(stderr,“无法连接到地址!\n”);
关闭(simpleSocket);
出口(1);
}
/*从服务器获取消息*/
做{
printf(“获取数据编号或终止(写入“0”):”;
fgets(buffsend,256,标准输入);
n=atoi(buffsend);
如果(n>6){
printf(“错误\n”);
}
否则{
对于(i=0;i0));
关闭(simpleSocket);
返回0;
}
对于服务器:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int simpleSocket = 0;
int simplePort = 0;
int returnStatus = 0;
char buff[256];
char message[256];
int count;
struct sockaddr_in simpleServer;
if (2 != argc) {
fprintf(stderr, "Usage: %s <port>\n", argv[0]);
exit(1);
}
simpleSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (simpleSocket == -1) {
fprintf(stderr, "Could not create a socket!\n");
exit(1);
}
else {
fprintf(stderr, "Socket created!\n");
}
/* retrieve the port number for listening */
simplePort = atoi(argv[1]);
/* setup the address structure */
/* use INADDR_ANY to bind to all local addresses */
memset(&simpleServer, '\0', sizeof(simpleServer));
simpleServer.sin_family = AF_INET;
simpleServer.sin_addr.s_addr = htonl(INADDR_ANY);
simpleServer.sin_port = htons(simplePort);
/* bind to the address and port with our socket */
returnStatus = bind(simpleSocket,(struct sockaddr *)&simpleServer,sizeof(simpleServer));
if (returnStatus == 0) {
fprintf(stderr, "Bind completed!\n");
}
else {
fprintf(stderr, "Could not bind to address!\n");
close(simpleSocket);
exit(1);
}
/* lets listen on the socket for connections */
returnStatus = listen(simpleSocket, 5);
if (returnStatus == -1) {
fprintf(stderr, "Cannot listen on socket!\n");
close(simpleSocket);
exit(1);
}
while (1)
{
struct sockaddr_in clientName = { 0 };
int simpleChildSocket = 0;
int clientNameLength = sizeof(clientName);
/* wait here */
simpleChildSocket = accept(simpleSocket,(struct sockaddr *)&clientName, &clientNameLength);
if (simpleChildSocket == -1) {
fprintf(stderr, "Cannot accept connections!\n");
close(simpleSocket);
exit(1);
}
/* handle the new connection request */
/* write out our message to the client */
while(read(simpleChildSocket, buff, 256))
cont++;
printf("%s", buff);
printf("Data received: %d %s\n", cont, buff);
close(simpleChildSocket);
}
close(simpleSocket);
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[]){
int simpleSocket=0;
int simplePort=0;
int returnStatus=0;
字符buff[256];
字符消息[256];
整数计数;
simpleServer中的结构sockaddr_;
如果(2!=argc){
fprintf(stderr,“用法:%s\n”,argv[0]);
出口(1);
}
simpleSocket=socket(AF_INET、SOCK_STREAM、IPPROTO_TCP);
if(simpleScocket==-1){
fprintf(stderr,“无法创建套接字!\n”);
出口(1);
}
否则{
fprintf(stderr,“已创建套接字!\n”);
}
/*检索用于侦听的端口号*/
simplePort=atoi(argv[1]);
/*设置地址结构*/
/*使用INADDR_ANY绑定到所有本地地址*/
memset(&simpleServer,'\0',sizeof(simpleServer));
simpleServer.sin_family=AF_INET;
simpleServer.sin_addr.s_addr=htonl(INADDR_ANY);
simpleServer.sin_port=htons(simplePort);
/*使用套接字绑定到地址和端口*/
returnStatus=bind(simpleSocket,(struct sockaddr*)&simpleServer,sizeof(simpleServer));
如果(返回状态==0){
fprintf(标准“绑定完成!\n”);
}
否则{
fprintf(stderr,“无法绑定到地址!\n”);
关闭(simpleSocket);
出口(1);
}
/*让我们在套接字上侦听连接*/
returnStatus=listen(simpleSocket,5);
如果(返回状态==-1){
fprintf(stderr,“无法在套接字上侦听!\n”);
关闭(simpleSocket);
出口(1);
}
而(1)
{
clientName={0}中的结构sockaddr_;
int simpleChildSocket=0;
int clientNameLength=sizeof(clientName);
/*在这儿等着*/
simpleChildSocket=accept(simpleSocket,(struct sockaddr*)&clientName和&clientNameLength);
如果(simpleChildSocket==-1){
fprintf(stderr,“无法接受连接!\n”);
关闭(simpleSocket);
出口(1);
}
/*处理新的连接请求*/
/*把我们的信息写给客户*/
while(读(simpleChildSocket,buff,256))
cont++;
printf(“%s”,浅黄色);
printf(“收到的数据:%d%s\n”,续,buff);
关闭(simpleChildSocket);
}
关闭(simpleSocket);
返回0;
}
问题在于客户端在每个值之后发送字符串终止符(\0
),因此当服务器打印整个消息时,它会在第一个值之后停止打印
通过在发送时不包含字符串终止符,可以克服此特定问题:
write(simpleSocket, buffsend, strlen(buffsend)); /* Removed the +1 */
接收消息时,需要添加字符串终止符:
int length;
char buff[256];
while((length = read(simpleChildSocket, buff, 256-1)) > 0) {
buff[length] = `\0`;
cont++;
printf("Data received: %d %d %s\n", cont, length, buff);
}
还请注意,您使用的是基于流的套接字。这意味着套接字本身没有消息协议的概念。有关详细信息,请参阅。问题在于客户端正在发送字符串终止符(
\0
)在每个值之后,因此当服务器打印整个消息时,它会在第一个值之后停止打印
通过在发送时不包含字符串终止符,可以克服此特定问题:
write(simpleSocket, buffsend, strlen(buffsend)); /* Removed the +1 */
接收消息时,需要添加字符串终止符:
int length;
char buff[256];
while((length = read(simpleChildSocket, buff, 256-1)) > 0) {
buff[length] = `\0`;
cont++;
printf("Data received: %d %d %s\n", cont, length, buff);
}
还请注意,您使用的是基于流的套接字。这意味着套接字本身没有消息协议的概念。有关更多信息,请参阅。我无法编译您的客户端进行测试。我使用netcat进行测试(netcat 0端口) 我不明白是什么问题,是因为你没有指纹吗? 这是因为printf使用put,而put做一些缓冲,所以