我在改變我的服務器發送的資料量并使其發送資料時遇到了困難。這段代碼失敗了,但當我將 buffer 的大小改為 16 個字符時,它就作業了。
這是 transferclient.c 的代碼
#include <errno.h>
#include <getopt.h>
#include <netdb.h>
#include <netinet/in.h>/span>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>/span>
#include <sys/types.h>/span>
#include <unistd.h>
#define BUFSIZE 218
int main(int argc, char **argv) /span> {
unsigned short portno = 10823;
int sock = 0;
struct sockaddr_in serv_addr;
char buffer[32] = {0};
if ((sock = socket(AF_INET, SOCK_STREAM, 0) < 0)
{
printf("
插座創建錯誤
")。)
return -1;
}
serv_addr.sin_family = AF_INET。
serv_addr.sin_port = htons(portno);
printf("Attemping to connect
")。)
if (connect(sock, (struct sockaddr *) & serv_addr, sizeof(Serv_addr)) < 0)
{
printf("
連接失敗
")。)
return -1;
}
printf("Connected
")。)
read(sock, buffer, 16)。
return 0;
這是Transfererver.c的代碼
。#include <errno.h>
#include <getopt.h>
#include <netdb.h>
#include <netinet/in.h>/span>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>/span>
#include <sys/types.h>/span>
#include <unistd.h>
#define BUFSIZE 218
int main(int argc, char **argv) /span> {
int portno = 10823; /* 埠監聽 */
int server_fd, new_socket;
struct sockaddr_in address;
int opt =1;
int addrlen = sizeof(address);
//創建socket檔案描述符。
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0) == 0)
{
perror("socket failed")。
exit(EXIT_FAILURE)。
}
//將套接字附加到埠上。
if (setockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, & opt, sizeof(opt))
{
perror("setockopt")。
exit(EXIT_FAILURE)。
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(portno);
//Forcefully attaching socket to the port。
if (bind(server_fd, (struct sockaddr *) & address, sizeof(address))<0)
{
perror("bind failed")。
exit(EXIT_FAILURE)。
}
if (listen(server_fd, 3) < 0) {
perror("listen")。
exit(EXIT_FAILURE)。
}
printf("Listening
")。)
while ((new_socket = accept(server_fd, (struct sockaddr *) & address, (socklen_t*) & addrlen) > 0)
{
printf("%d
", new_socket)。)
printf("Socket connected
")。)
}
return 0;
}
服務器端
監聽
4
插座已連接
***客戶端****
```
嘗試連接
已連接
當我把transferclient.c中的一行改為32位元組時。
char buffer[32] = {0};
套接字連接失敗。
服務器端
Listening
客戶端
Attemping to connect
這是為什么呢?
uj5u.com熱心網友回復:
在客戶端代碼中,你似乎沒有設定serv_addr的所有欄位。
struct sockaddr_in serv_addr; /span>
[...]
serv_addr.sin_family = AF_INET。
serv_addr.sin_port = htons(portno)。
因為你沒有設定serv_addr.sin_addr,當你把它傳遞給函式connect時,它將有一個不確定的(垃圾)值。
我的猜測是,改變陣列的大小導致serv_addr的sin_addr欄位有一個不同的初始(垃圾)值。這就是為什么當buffer的大小為16時,代碼可以作業,但當它的大小為32時,就會失敗。
uj5u.com熱心網友回復:
在我看來......除了其他答案中已經提到的,你缺少常量......你應該定義一些東西:
#define BUFFER_SIZE (32)
然后使用
char buffer[BUFFER_SIZE] 。
而且
read(sock, buffer, BUFFER_SIZE);
或者,如果你不喜歡這種方法,可以使用其他的方法:
char buffer[32] 。
以及后來的
read(sock, buffer, sizeof buffer)。
但是如果你在緩沖區大小和read()呼叫中使用了不同的數字,那么當你呼叫read()時,以16作為要讀取的字符數,它就不能正常作業。
順便說一下,你要求套接字讀取一個固定數量的位元組,而它回傳的位元組數少于你要求的數量是很常見的,所以你檢查read(2)的回傳值是非常重要的。 類似于:
ssize_t n = read(sock, buffer, BUFFER_SIZE) 。
因為從buffer[n]到buffer[sizeof buffer - 1]可能沒有什么對你的代碼有用的東西(之前的讀取的休息,或類似的)它是很常見的,列印它的東西,如:
if (n > 0)
printf("讀取。[%.*s]
", n, buffer)。)
這將列印出收到的有效字符的數量,而不是在緩沖區中后面的內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/311842.html
標籤:
