无法在TCP/IP聊天程序中工作 /*服务器代码*/ #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #定义最大尺寸50 无效传输(); 无效接收(); int sockfd、newsockfd、retval; socklen_t actuallen; int receidbytes,sentbytes; serveraddr、clientaddr中的结构sockaddr\u; //字符buff[MAXSIZE]; int a=0,端口号; main() { printf(“输入端口号:”); scanf(“%d”和端口号); sockfd=套接字(AF_INET,SOCK_STREAM,0); 如果(sockfd==-1){ printf(“\n套接字创建错误”); 出口(-1); } serveraddr.sin_family=AF_INET; serveraddr.sin\u port=htons(端口号); serveraddr.sin\u addr.s\u addr=htonl(INADDR\u ANY); retval=bind(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr)); 如果(retval==-1){ printf(“绑定错误”); 关闭(sockfd); 出口(0); } retval=listen(sockfd,1); 如果(retval==-1){ 关闭(sockfd); 出口(0); } 实际值=sizeof(客户地址); newsockfd=accept(sockfd,(struct sockaddr*)&clientaddr,&actuallen); 如果(newsockfd==-1){ 关闭(sockfd); 出口(0); } int i=1; pid_t pid=fork(); 如果(pid==0) 传输(); 其他的 receive(); 关闭(newsockfd); 关闭(sockfd); } 无效接收() { 字符buff[50];int f=1; while(f) { recedbytes=recv(newsockfd,buff,sizeof(buff),0); 如果(接收字节==-1){ 关闭(sockfd); 关闭(newsockfd); 出口(0); } printf(“接收字节:%d\n”,接收字节); 如果(strcmp(buff,“Stop”)==0) { 卖出期权(“交割”); strcpy(浅黄色,“停止”); sentbytes=send(newsockfd,buff,sizeof(buff),0); if(sentbytes==-1){ 关闭(sockfd); 关闭(newsockfd); 出口(0); } f=0; } 否则{ char cl[]=“客户:”; strcat(cl,buff); 看跌期权(cl); } } } 无效传输() { 字符buff[50]; 而(1) { //printf(“%s”,“You:”); 获得(buff); sentbytes=send(newsockfd,buff,sizeof(buff),0); if(sentbytes==-1){ 关闭(sockfd); 关闭(newsockfd); 出口(0); } } } /*客户端代码*/ #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #定义最大尺寸50 无效传输(); 无效接收(); int sockfd,retval; int receidbytes,sentbytes; serveraddr中的结构sockaddr\u; //字符buff[MAXSIZE]; main() { 国际港口号; printf(“输入端口号:”); scanf(“%d”和端口号); sockfd=套接字(AF_INET,SOCK_STREAM,0); 如果(sockfd==-1){ printf(“\n套接字创建错误”); 出口(-1); } serveraddr.sin_family=AF_INET; serveraddr.sinu端口=htons(端口号); serveraddr.sin_addr.s_addr=inet_addr(“127.0.0.1”); retval=connect(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr)); 如果(retval==-1){ printf(“连接错误”);close(sockfd); 出口(0); } int i=1; pid_t pid=fork(); 如果(pid==0) 传输(); 其他的 receive(); printf(“\n”); 关闭(sockfd); } 无效接收() { 字符buff[50]; int f=1; while(f) { recedbytes=recv(sockfd,buff,sizeof(buff),0); 如果(接收字节==-1){ 关闭(sockfd); 出口(0); } printf(“接收字节:%d\n”,接收字节); 如果(strcmp(buff,“Stop”)==0) { 卖出期权(“交割”); f=0; strcpy(浅黄色,“停止”); sentbytes=send(sockfd,buff,sizeof(buff),0); if(sentbytes==-1){ 关闭(sockfd); 出口(0); } } 否则{ char sr[]=“服务器:”; strcat(sr,buff); 卖出期权(sr); } } } 无效传输() { 字符buff[50]; 而(1) { //printf(“%s”,“You:”); 获得(buff); sentbytes=send(sockfd,buff,sizeof(buff),0); if(sentbytes==-1){ 关闭(sockfd); 出口(0); } } }
我正在尝试使用无法在TCP/IP聊天程序中工作 /*服务器代码*/ #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #定义最大尺寸50 无效传输(); 无效接收(); int sockfd、newsockfd、retval; socklen_t actuallen; int receidbytes,sentbytes; serveraddr、clientaddr中的结构sockaddr\u; //字符buff[MAXSIZE]; int a=0,端口号; main() { printf(“输入端口号:”); scanf(“%d”和端口号); sockfd=套接字(AF_INET,SOCK_STREAM,0); 如果(sockfd==-1){ printf(“\n套接字创建错误”); 出口(-1); } serveraddr.sin_family=AF_INET; serveraddr.sin\u port=htons(端口号); serveraddr.sin\u addr.s\u addr=htonl(INADDR\u ANY); retval=bind(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr)); 如果(retval==-1){ printf(“绑定错误”); 关闭(sockfd); 出口(0); } retval=listen(sockfd,1); 如果(retval==-1){ 关闭(sockfd); 出口(0); } 实际值=sizeof(客户地址); newsockfd=accept(sockfd,(struct sockaddr*)&clientaddr,&actuallen); 如果(newsockfd==-1){ 关闭(sockfd); 出口(0); } int i=1; pid_t pid=fork(); 如果(pid==0) 传输(); 其他的 receive(); 关闭(newsockfd); 关闭(sockfd); } 无效接收() { 字符buff[50];int f=1; while(f) { recedbytes=recv(newsockfd,buff,sizeof(buff),0); 如果(接收字节==-1){ 关闭(sockfd); 关闭(newsockfd); 出口(0); } printf(“接收字节:%d\n”,接收字节); 如果(strcmp(buff,“Stop”)==0) { 卖出期权(“交割”); strcpy(浅黄色,“停止”); sentbytes=send(newsockfd,buff,sizeof(buff),0); if(sentbytes==-1){ 关闭(sockfd); 关闭(newsockfd); 出口(0); } f=0; } 否则{ char cl[]=“客户:”; strcat(cl,buff); 看跌期权(cl); } } } 无效传输() { 字符buff[50]; 而(1) { //printf(“%s”,“You:”); 获得(buff); sentbytes=send(newsockfd,buff,sizeof(buff),0); if(sentbytes==-1){ 关闭(sockfd); 关闭(newsockfd); 出口(0); } } } /*客户端代码*/ #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #定义最大尺寸50 无效传输(); 无效接收(); int sockfd,retval; int receidbytes,sentbytes; serveraddr中的结构sockaddr\u; //字符buff[MAXSIZE]; main() { 国际港口号; printf(“输入端口号:”); scanf(“%d”和端口号); sockfd=套接字(AF_INET,SOCK_STREAM,0); 如果(sockfd==-1){ printf(“\n套接字创建错误”); 出口(-1); } serveraddr.sin_family=AF_INET; serveraddr.sinu端口=htons(端口号); serveraddr.sin_addr.s_addr=inet_addr(“127.0.0.1”); retval=connect(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr)); 如果(retval==-1){ printf(“连接错误”);close(sockfd); 出口(0); } int i=1; pid_t pid=fork(); 如果(pid==0) 传输(); 其他的 receive(); printf(“\n”); 关闭(sockfd); } 无效接收() { 字符buff[50]; int f=1; while(f) { recedbytes=recv(sockfd,buff,sizeof(buff),0); 如果(接收字节==-1){ 关闭(sockfd); 出口(0); } printf(“接收字节:%d\n”,接收字节); 如果(strcmp(buff,“Stop”)==0) { 卖出期权(“交割”); f=0; strcpy(浅黄色,“停止”); sentbytes=send(sockfd,buff,sizeof(buff),0); if(sentbytes==-1){ 关闭(sockfd); 出口(0); } } 否则{ char sr[]=“服务器:”; strcat(sr,buff); 卖出期权(sr); } } } 无效传输() { 字符buff[50]; 而(1) { //printf(“%s”,“You:”); 获得(buff); sentbytes=send(sockfd,buff,sizeof(buff),0); if(sentbytes==-1){ 关闭(sockfd); 出口(0); } } },c,sockets,tcp,send,gets,C,Sockets,Tcp,Send,Gets,我正在尝试使用TCP/IP创建聊天server/client程序,并在C(linux)中创建进程。 客户端程序和服务器程序的transmit函数中的gets(buff)似乎没有起到阻止作用,而send(…)函数正在传输一个空的buff。 因此,服务器程序和客户端程序中的客户机:或服务器:正在打印,即使对方程序实际上没有发送任何数据 /* Server Code */ #include<stdio.h> #include<stdio.h> #include<stdli
TCP/IP
创建聊天server/client
程序,并在C(linux)
中创建进程。
客户端程序和服务器程序的transmit
函数中的gets(buff)
似乎没有起到阻止作用,而send(…)
函数正在传输一个空的buff。
因此,服务器程序和客户端程序中的客户机:或服务器:正在打印,即使对方程序实际上没有发送任何数据
/* Server Code */
#include<stdio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<pthread.h>
#define MAXSIZE 50
void transmit();
void Recieve();
int sockfd, newsockfd, retval;
socklen_t actuallen;
int recedbytes, sentbytes;
struct sockaddr_in serveraddr, clientaddr;
// char buff[MAXSIZE];
int a = 0, port_no;
main()
{
printf("Enter port number: ");
scanf("%d",&port_no);
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd==-1) {
printf("\nSocket creation error");
exit(-1);
}
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(port_no);
serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);
retval= bind(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr));
if(retval == -1) {
printf("Binding error");
close(sockfd);
exit(0);
}
retval = listen(sockfd, 1);
if (retval == -1) {
close(sockfd);
exit(0);
}
actuallen = sizeof(clientaddr);
newsockfd = accept(sockfd, (struct sockaddr*)&clientaddr, &actuallen);
if(newsockfd == -1) {
close(sockfd);
exit(0);
}
int i=1;
pid_t pid = fork();
if(pid == 0)
transmit();
else
Recieve();
close(newsockfd);
close(sockfd);
}
void Recieve()
{
char buff[50]; int f=1;
while(f)
{
recedbytes=recv(newsockfd,buff,sizeof(buff),0);
if(recedbytes == -1) {
close(sockfd);
close(newsockfd);
exit(0);
}
printf("recdbytes: %d\n", recedbytes);
if(strcmp(buff, "Stop") == 0)
{
puts("Closing");
strcpy(buff,"Stop");
sentbytes=send(newsockfd,buff,sizeof(buff),0);
if(sentbytes == -1) {
close(sockfd);
close(newsockfd);
exit(0);
}
f=0;
}
else {
char cl[]="Client: ";
strcat(cl,buff);
puts(cl);
}
}
}
void transmit()
{
char buff[50];
while(1)
{
// printf("%s","You: ");
gets(buff);
sentbytes = send(newsockfd, buff, sizeof(buff), 0);
if(sentbytes == -1) {
close(sockfd);
close(newsockfd);
exit(0);
}
}
}
/* Client Code */
#include<stdio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<pthread.h>
#define MAXSIZE 50
void transmit();
void Recieve();
int sockfd, retval;
int recedbytes, sentbytes;
struct sockaddr_in serveraddr;
// char buff[MAXSIZE];
main()
{
int port_no;
printf("Enter port number:");
scanf("%d",&port_no);
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd == -1) {
printf("\nSocket creation error");
exit(-1);
}
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(port_no);
serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
retval = connect(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr));
if(retval == -1) {
printf("Connection error"); close(sockfd);
exit(0);
}
int i = 1;
pid_t pid = fork();
if(pid == 0)
transmit();
else
Recieve();
printf("\n");
close(sockfd);
}
void Recieve()
{
char buff[50];
int f=1;
while(f)
{
recedbytes = recv(sockfd, buff, sizeof(buff), 0);
if(recedbytes == -1) {
close(sockfd);
exit(0);
}
printf("recdbytes: %d\n",recedbytes);
if(strcmp(buff, "Stop") == 0)
{
puts("Closing");
f = 0;
strcpy(buff, "Stop");
sentbytes = send(sockfd, buff, sizeof(buff), 0);
if(sentbytes == -1) {
close(sockfd);
exit(0);
}
}
else {
char sr[] = "Server :";
strcat(sr, buff);
puts(sr);
}
}
}
void transmit()
{
char buff[50];
while(1)
{
// printf("%s","You: ");
gets(buff);
sentbytes = send(sockfd, buff, sizeof(buff), 0);
if(sentbytes == -1) {
close(sockfd);
exit(0);
}
}
}
您如何期望strcmp
知道接收字符串的长度?您从未使用recedbytes
执行过任何操作
您还有许多其他bug。您希望recv
以某种方式接收消息,尽管您从未实现过任何消息协议
如果您想发送和接收消息,您必须做三件事:
代码中没有证据表明你做过这些事。如果您对消息的定义是“正好50个字节,始终包含一个零字节,表示接收方应处理的数据结束”,那么您在1和2上可能没有问题,但您肯定没有做3。不要使用
get
,使用fgets
函数读取行。但是fgets不是用于文件输入吗?我想从终端获取输入。您可以提及stdin
从标准输入获取输入。是的,我这样做了,它似乎仍然不起作用。我将get替换为if(fgets(buff,sizeof(buff),stdin)!=NULL){//send}'if(fgets(buff,sizeof(buff),stdin)!=NULL){//send buff}
recedbytes=recv(newsockfd,buff,sizeof(buff),0);
if(recedbytes == -1) {
close(sockfd);
close(newsockfd);
exit(0);
}
printf("recdbytes: %d\n", recedbytes);
if(strcmp(buff, "Stop") == 0)