ฉันกำลังพยายามเขียนอินเทอร์เฟซซ็อกเก็ต TCP สำหรับโปรแกรมของฉัน และฉันกำลังดึงผมออกโดยมีข้อผิดพลาด Accept() (ฉันคิดว่า) สำหรับสิ่งนี้ ฉันได้สร้างโค้ดทดสอบแบบสรุปแล้ว
ก่อนอื่น ฉันต้องตั้งค่าเล็กน้อย
int server_socket = 0;
server_socket = socket(AF_INET, SOCK_STREAM, 0);
int accepted_connection = 0;
struct sockaddr_in server_address;
server_address.sin_port = htons(9001);
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = INADDR_ANY;
struct sockaddr_in client_address;
client_address.sin_port = 0;
client_address.sin_family = AF_INET;
char * server_socket_read_buffer[100] = {0};
int server_socket_read_length = 0;
ทุกสิ่งค่อนข้างเรียบง่าย เพียงจัดสรรตัวแปรบางส่วน ต่อไปฉันจะผูกมัดและฟัง
if (bind(server_socket,(struct sockaddr *)&server_address, sizeof(server_address)) < 0)
{
perror("Bind() on server_socket has failed\n");
}
if (listen(server_socket, 10) < 0)
{
perror("Listen() on server_socket has failed\n");
}
ต่อไปคือส่วนที่ฉันเชื่อว่าฉันมีปัญหา
printf("Attempting accept!\n");
if (accepted_connection = accept(server_socket, (struct sockaddr *)NULL, NULL) < 0)
{
perror("Accept failed\n");
}
sleep(10);
if (server_socket_read_length = read(accepted_connection, &server_socket_read_buffer, server_socket_read_length) < 0)
{
perror("Read failed\n");
}
printf("Read %d bytes from socket\n", server_socket_read_length);
for (int i = 0; i<server_socket_read_length;i++)
{
printf("%x\n",server_socket_read_buffer[i]);
}
สิ่งนี้จะคอมไพล์และรัน เมื่อฉันใช้ nc ด้วยคำสั่ง 'nc 127.0.0.1 9001' ฉันได้รับการเชื่อมต่อ แต่ไม่มีข้อมูลถูกอ่าน โดยเฉพาะฉันได้รับข้อมูล 0 ไบต์ ฉันคิดว่านี่อาจเป็นเพราะค่า NULL ในบรรทัดยอมรับ แต่การเปลี่ยนสิ่งเหล่านั้นเป็นโครงสร้างและความยาวที่เหมาะสมทำให้โค้ดของฉันไม่สามารถคอมไพล์ได้
หากใครสามารถให้ความกระจ่างเกี่ยวกับสิ่งที่ฉันทำผิดฉันจะขอบคุณมาก
htons()
กับค่าคงที่เสมอเมื่อตั้งค่าฟิลด์sin_port
บนเครื่อง little-endian ไบต์จะถูกกลับด้าน ในขณะที่เครื่อง big-endian นั้นไม่ต้องดำเนินการ - person dbush   schedule 06.07.2015