我正在为学校开发一个服务器-客户端程序,并使用给定的代码进行 TCP 连接。 客户端:
void func(int sockfd)
{
char entryArr[MAXSIZE][MAXLEN];
int n,c;
int i = 0;
char entry;
char iEntry[1];
char id[6];
char fname[5];
char lname[5];
char score[4];
for (;;) {
bzero(id, sizeof(id));
bzero(fname, sizeof(fname));
bzero(lname, sizeof(lname));
bzero(score, sizeof(score));
printf("[1] Add a Student \n"); //Menu
printf("[2] Display ID \n");
printf("[3] Display Score \n");
printf("[4] Display All \n");
printf("[5] Delete an Entry \n");
printf("[6] Exit \n");
printf("Please Select from the Menu: "); //get menu selection
scanf("%1s", iEntry); //read entry
if (iEntry[0] == '1') //if entry = 1
{
getchar();
printf("\n------Add a New Student------ \n");
printf("\n6-Digit ID: ");
scanf("%6s", id); //read 6 digit id
while ( (c = getchar()) != '\n' && c != EOF );
printf("Student's First Name: ");
scanf("%5s", fname); //read first namae
while ( (c = getchar()) != '\n' && c != EOF );
printf("Student's Last Name: ");
scanf("%5s", lname); //read last name
while ( (c = getchar()) != '\n' && c != EOF );
printf("Student's Score: ");
scanf("%3s", score); //read score
while ( (c = getchar()) != '\n' && c != EOF );
write(sockfd, iEntry, sizeof(iEntry)); //write entry number
write(sockfd, id, sizeof(id)); //write id
write(sockfd, fname, sizeof(fname)); //write fname
write(sockfd, lname, sizeof(lname)); //write lname
write(sockfd, score, sizeof(score)); //write score
printf("\n------Student Added------\n");
i++;
}
int main()
{
int sockfd;
struct sockaddr_in serverAddr;
socklen_t addr_size;
sockfd = socket(PF_INET, SOCK_STREAM, 0);
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(7891);
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero);
addr_size = sizeof serverAddr;
connect(sockfd, (struct sockaddr *) &serverAddr, addr_size);
func(sockfd);
close(sockfd);
}
服务器端:
void func(int sockfd)
{
int i = 0;
char idArr[MAXSIZE][MAXLEN];
char fnameArr[MAXSIZE][MAXLEN];
char lnameArr[MAXSIZE][MAXLEN];
char scoreArr[MAXSIZE][MAXLEN];
char entryArr[MAXSIZE][MAXLEN];
char iEntry[1];
char id[6];
char fname[5];
char lname[5];
char score[3];
int n,c;
char entry;
// infinite loop for chat
for (;;) {
printf("HERE6\n");
bzero(iEntry, sizeof(iEntry));
bzero(id, sizeof(id));
bzero(fname, sizeof(fname));
bzero(lname, sizeof(lname));
bzero(score, sizeof(score));
read(sockfd, iEntry, sizeof(iEntry));
strcpy(entryArr[0], iEntry);
if (iEntry[0] == '1')
{
read(sockfd, id, sizeof(id));
read(sockfd, fname, sizeof(fname));
read(sockfd, lname, sizeof(lname));
read(sockfd, score, sizeof(score));
printf("HERE5\n");
strcpy(idArr[i], id);
strcpy(fnameArr[i], fname);
strcpy(lnameArr[i], lname);
strcpy(scoreArr[i], score);
printf("Student Added.\n");
i++;
}
int main()
{
int sockfd, connfd;
struct sockaddr_in serverAddr;
struct sockaddr_storage serverStorage;
socklen_t addr_size;
sockfd = socket(PF_INET, SOCK_STREAM, 0);
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(7891);
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero);
bind(sockfd, (struct sockaddr *) &serverAddr, sizeof(serverAddr));
if(listen(sockfd,5)==0)
printf("Listening\n");
else
printf("Error\n");
addr_size = sizeof serverStorage;
connfd = accept(sockfd, (struct sockaddr *) &serverStorage, &addr_size);
func(connfd);
close(sockfd);
}
在我的 func() 函数中,我正在运行一个带有选项的菜单。当使用 PuTTy(即 eros.tx.state.edu)在同一终端上运行时,该程序按预期工作。 当我在两个不同的终端(在同一台机器上)上运行时,程序可以工作,但一旦到达第一个 write() 就退出。
知道为什么会发生这种情况吗? 很抱歉这篇文章很长,我试图将其保持在最低限度。
最佳答案
char iEntry[1];
好的,iEntry
包含单个字符。
read(sockfd, iEntry, sizeof(iEntry));
strcpy(entryArr[0], iEntry);
为什么要将iEntry
传递给strcpy
?这是一个单一的角色。您如何期望 strcpy
知道它应该只复制单个字符?
为什么不直接测试iEntry[0]
?为什么 iEntry
是一个数组?
您的代码忽略read
的返回值。您至少需要通过编写某种“读取全部”函数来精确读取指定的字节数来处理短读取。
关于c - TCP 服务器-客户端在单次传输后断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60166861/