Socket tcp/ip linux

Em viết đang viết code thì em gặp 1 trường hợp là khi server lắng nghe client. Em chỉ cho kết nối tối đa là 1 nhưng khi cho 1 client khác chạy thì nó vẫn thông báo đã kết nối trên linux mà bên server thì không có chuyện gì xảy ra hệt nó lỗi ở đâu? Code của em:
Server:

 listen(serverSocket, 1);
 
 //connect 
 int clientSocket;
 clientSocket = accept(serverSocket, NULL, NULL);

 if(clientSocket == -1)
 {
  puts("error");
 }
 else
 {
  puts("Connection!");
 }

Client:

 //connect socket
 int connection_status =  connect(tcpSocket, (struct sockaddr*) &server_address, sizeof(server_address));
 
 // inform connection
 if(connection_status == -1)
 {
  printf("connect fail\n");
  exit(1);
 }
 else
 {
  puts("connect success");
 }

Code bạn cho 1 client access ở đâu??
// BSD socket nhé, linux socket có phần không đúng

Tham số 2 của hàm listen là có ý nghĩa gì anh? Em dịch ra thì nghĩ nó là số lượng kết nối socket!
http://man7.org/linux/man-pages/man2/listen.2.html

Em đang tự tìm hiểu nên mò đại! Không biết gì nó hết! Tìm trên mạng vs đọc tài liệu mà anh văn tệ quá nên nó biến thành thảm họa!

Nếu bạn mới tìm hiểu thì có thể dùng luôn thư viện asio, nó rất đơn giản, dễ tuỳ biến, viết bằng C++, sample code rộng
Dùng nó để hiểu socket và protocol hoạt động ra sao, sau đó quay lại bsd socket hay không thì tuỳ bạn

2 Likes

Có thật tham số thứ 2 của hàm listen() là cổng nào đó không bạn???

Hàm listen() để thiết lập socket vào chế độ listen với tham số đầu là “id” của socket, tham số thứ hai là max client được phép chờ trong hàng đợi để được accept().

1 Like

Tks bác, mình so với asio nên nghĩ nó là set cổng lắng nghe.

vậy anh cho em hỏi là socket em bị lỗi gì anh!

Nó không bị lỗi gì cả, như mình đã giải thích đó. Khi bạn đã accept clien thứ nhất thì lúc này hàng đợi chờ kết nối sẽ trống, clien tiếp theo sẽ được phép kết nối và chờ bạn accept để có thể gửi nhận dữ liệu.
Để loại bỏ những kết nối không mong muốn thì sau khi accept, server phải tự kiểm tra rồi disconnect client đó. Ví dụ điều kiện kiểm tra có thể là ip client…

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?