Saya mencoba menulis antarmuka soket TCP untuk program saya dan saya mengalami kesalahan Accept() (menurut saya). Untuk ini saya telah membuat beberapa kode pengujian yang diringkas.
Pertama saya melakukan sedikit pengaturan
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;
Semua hal yang cukup sederhana. Alokasikan saja beberapa variabel. Selanjutnya saya mengikat dan mendengarkan
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");
}
Berikutnya adalah bagian di mana saya yakin saya mempunyai masalah
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]);
}
Ini dikompilasi dan dijalankan. Ketika saya menggunakan nc dengan perintah 'nc 127.0.0.1 9001' saya mendapatkan koneksi, tetapi tidak ada data yang dibaca. Khususnya saya mendapatkan 0 byte data. Saya pikir ini mungkin disebabkan oleh NULL di baris penerimaan, tetapi mengubahnya menjadi struct dan panjangnya yang tepat mencegah kode saya dikompilasi.
Jika ada yang bisa menjelaskan kesalahan saya, saya akan sangat berterima kasih.
htons()
pada nilai konstan saat mengatur kolomsin_port
. Pada mesin little-endian, byte akan dibalik, sedangkan pada mesin big-endian tidak boleh dioperasikan. - person dbush   schedule 06.07.2015