- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个在服务器端工作的 UDP 套接字应用程序。为了测试服务器端,我编写了一个简单的 python 客户端程序,它发送消息“hello world how are you”。服务器随后应接收消息,将其转换为大写并发送回客户端。问题就在这里:我可以在调试时观察到服务器正在接收消息、应用转换、发回响应并最终等待另一条消息。然而,python 客户端没有收到消息,而是无休止地等待服务器的响应。
我通过网络发现(一个选项)为了让客户端接收到它需要绑定(bind)到服务器的响应,这与我在教科书(Linux 编程接口(interface))中看到的背道而驰。尽管如此,我尝试将客户端绑定(bind)到服务器,但 python 程序无法在绑定(bind)线上连接(不知道我是否正确)。 Python 版本为 2.7.5。客户端程序在 RedHat 上运行,服务器在 Angstrom 的目标模块上运行(它是为 32 位处理器交叉编译的)。
这是客户端的代码:
import socket
nhập khẩu hệ điều hành
UDP_IP = "192.168.10.4"
UDP_PORT = 50005
#dir_path = os.path.dirname(os.path.realpath(__file__))
MESSAGE = "hello world how are you"
print "UDP target IP: ", UDP_IP
print "UDP target port: ", UDP_PORT
print "message: ", MESSAGE
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#sock.bind((UDP_IP, UDP_PORT))
print "Sending message..."
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
print "Message sent!"
print "Waiting for response..."
data = sock.recv(1024)
print "Received", repr(data)
这是服务器的代码:
void server_side(void)
{
printf("Server start up.\n");
struct sockaddr_in svaddr;
struct sockaddr_in claddr;
int sfd;
int j;
ssize_t numBytes;
socklen_t len;
char buf[BUF_SIZE];
char claddrStr[INET_ADDRSTRLEN];
//int output = open("test_output.txt", O_WRONLY|O_CREAT, 0664);
printf("Creating new UDP socket...\n");
sfd = socket(AF_INET, SOCK_DGRAM, 0); /* Create Server Socket*/
if (sfd == -1)
{
errExit("socket");
}
printf("Socket has been created!\n");
memset(&svaddr, 0, sizeof(struct sockaddr_in));
svaddr.sin_family = AF_INET;
svaddr.sin_addr.s_addr = htonl(INADDR_ANY);
svaddr.sin_port = htons(PORT_NUM);
printf("Binding in process...\n");
if (bind(sfd, (struct sockaddr *) &svaddr, sizeof(struct sockaddr_in))
== -1)
{
errExit("bind");
}
printf("Binded!\n");
/* Receive messages, convert to upper case, and return to client.*/
for(;;)
{
len = sizeof(struct sockaddr_in);
numBytes = recvfrom(sfd, buf, BUF_SIZE, 0,
(struct sockaddr *) &claddr, &len);
if (numBytes == -1)
{
errExit("recvfrom");
}
if (inet_ntop(AF_INET, &claddr.sin_addr, claddrStr,
INET_ADDRSTRLEN) == NULL)
{
printf("Couldn't convert client address to string.\n");
}
khác
{
printf("Server received %ld bytes from (%s, %u).\n", (long)
numBytes,
claddrStr, ntohs(claddr.sin_port));
}
claddr.sin_port = htons(PORT_NUM);
for (j = 0; j< numBytes; j++)
{
buf[j] = toupper((unsigned char) buf[j]);
}
if (sendto(sfd, buf, numBytes, 0, (struct sockaddr *) &claddr, len)
!= numBytes)
{
fatal("sendto");
}
}
}
同样的问题是我没有收到响应并在客户端打印回消息。我应该收到所有大写字母的相同消息。我觉得我错过了一个小细节。感谢您的帮助!
1 Câu trả lời
快速而肮脏:
从您的 C 代码中删除这一行:
claddr.sin_port = htons(PORT_NUM);
现在为什么:
当您在 python 脚本中发送消息时,您的操作系统将填充 UDP packet使用您指定的目标 IP 地址和端口,您在源 IP 字段中使用的机器的 IP 地址,最后是操作系统“随机”分配的源端口。请注意,这与目标端口不是同一个端口,即使是这样,您怎么知道哪个程序将收到源消息?(两者都会听到来自同一端口的消息)幸运的是,这不是可能。
现在,当您的 C 代码收到此数据包时,它将知道是谁发送了消息,并且您可以通过 recvfrom 填充的 sockaddr 结构访问此信息。如果你想发回一些信息,你必须发送一个目标端口(服务器看到的)等于客户端看到的源端口的数据包,这又不是你正在监听的相同端口服务器。通过执行 claddr.sin_port = htons(PORT_NUM)
,您可以设置用服务器端口覆盖包含客户端源端口的字段,当您尝试发送此数据包时,可能会发生两件事:
一个半生不熟的比喻:你收到一个 friend 的来信,但是给他回信的时候,你把他家的门牌号换成了你家的门牌号……没有多大意义。唯一不同的是,你这位 friend 的 Action 比较大,每个字母的编号可能不同,但这并不重要。
理论上,如果要接收回数据就必须绑定(bind),此时绑定(bind)相当于监听那个端口。这个答案阐明了为什么在这种情况下没有必要:https://stackoverflow.com/a/14243544/6253527
如果您使用的是 Linux,您可以使用 sudo ss -antup | 查看操作系统为 UDP 套接字分配的端口。 grep python
关于python - 客户端(python 程序)没有收到服务器(c 程序)返回的响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54311678/
#include sử dụng không gian tên std; lớp C{ riêng tư: int giá trị; công khai: C(){ giá trị = 0;
Câu hỏi này đã có câu trả lời: Sự khác biệt giữa char a[] = ?string?; và char *p = ?string?;? là gì? (8 câu trả lời) Đã đóng
đóng cửa. Câu hỏi này cần có thông tin chi tiết hoặc rõ ràng. Hiện tại không chấp nhận câu trả lời. Bạn có muốn cải thiện câu hỏi này không? Thêm chi tiết và làm rõ câu hỏi bằng cách chỉnh sửa bài đăng này. Đã đóng 7 năm trước. Bài viết này đã 8 tháng tuổi
Ngoài việc gỡ lỗi, có công cụ kiểm tra nào cho c, c++ hoặc c# hoạt động giống như sao chép và dán một hàm độc lập vào một hộp văn bản nào đó rồi nhập tham số vào các hộp văn bản khác không? Câu trả lời hay nhất Có lẽ bạn sẽ cân nhắc đến thử nghiệm đơn vị. Tôi khuyên bạn nên dùng Google Test và Google Mock
Tôi muốn di chuyển một cửa sổ (HWND) trên màn hình thứ hai. Vấn đề là tôi đã thử nhiều cách như tăng gấp đôi độ phân giải hoặc nhập giá trị âm nhưng nó vẫn không thể đặt cửa sổ trên màn hình thứ hai của tôi. Bất kỳ manh mối nào về cách thực hiện điều này trong C/C++/C# sẽ hữu ích nhất
Tôi đang tìm kiếm các triển khai hiện có của các loại DES khác nhau trong C/C++/C##. Nền tảng hệ điều hành của tôi là Windows XP/Vista/7. Tôi đang cố gắng viết một chương trình C# có thể mã hóa và giải mã bằng thuật toán DES. Tôi cần một số thực sự
Thật khó để biết nên hỏi gì ở đây. Câu hỏi này mơ hồ, không đầy đủ, quá rộng hoặc mang tính tu từ và không thể trả lời hợp lý theo hình thức hiện tại. Để được trợ giúp làm rõ vấn đề này để có thể mở lại, hãy truy cập trung tâm trợ giúp. Đóng 1
Có cách nào để buộc một cửa sổ khác phải ở trên cùng không? Không phải cửa sổ ứng dụng mà là một cửa sổ khác đang chạy trên hệ thống. (Windows, C/C++/C#) Câu trả lời hay nhất: SetWindowPos(that_window_ha
Giả sử bạn được lựa chọn giữa C/C++ hoặc Csharp và bạn dự định chạy nhiều phiên bản của cùng một máy chủ trên cả máy chủ Windows và Linux, thì lựa chọn thông minh nhất để xây dựng ứng dụng máy chủ socket là gì? Câu trả lời tốt nhất là
Bạn có thể cho tôi biết sự khác biệt giữa chúng không? Nhân tiện, có thứ gì được gọi là thư viện C++ hay thư viện C không? Câu trả lời hay nhất: Thư viện chuẩn C++ và Thư viện chuẩn C là các thư viện được định nghĩa bởi các chuẩn C++ và C và được cung cấp để các chương trình C++ và C sử dụng. Đó là những điểm chung của những từ đó
Mã kiểm tra bên dưới, tôi đưa thông tin đầu ra vào phần bình luận. Tôi đang sử dụng gcc 4.8.5 và Centos 7.2. #include #include lớp C { công khai:
Thật khó để biết câu hỏi ở đây là gì. Câu hỏi này mơ hồ, không rõ ràng, không đầy đủ, quá rộng hoặc mang tính tu từ và không thể trả lời hợp lý theo hình thức hiện tại. Để được trợ giúp làm rõ vấn đề này để bạn có thể mở lại, hãy truy cập trung tâm trợ giúp. Đã đóng
Khách hàng của tôi sẽ giao tiếp với khách hàng khác bằng cách sử dụng một cấu trúc/lớp gọi là annoucement. Tôi nghĩ tôi sẽ viết máy chủ bằng C++. Sẽ có nhiều lớp khác nhau kế thừa annoucement. Vấn đề của tôi là gửi các lớp này qua mạng đến máy khách. Tôi nghĩ có lẽ tôi nên sử dụng
Tôi có hàm sau trong C#: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
Tôi có một dự án trong đó tôi phải viết một hàm để làm gì đó với dữ liệu. Tôi có thể viết mã bằng C/C++ nhưng tôi không muốn chia sẻ mã hàm với công ty của mình. Thay vào đó, tôi chỉ muốn trao cho anh ta quyền gọi hàm đó trong mã của riêng anh ta. Có thể được không? Tôi nghĩ đến hai cách tiếp cận -
Tôi đang sử dụng API của bên thứ 3 (C/C++) được viết kém. Tôi sử dụng nó từ mã được quản lý (C++/CLI). Đôi khi có thể xảy ra "Lỗi vi phạm quyền truy cập". Việc này sẽ làm toàn bộ ứng dụng bị sập. Tôi biết tôi không thể xử lý những lỗi này [nếu con trỏ truy cập vào vị trí bộ nhớ bất hợp pháp, v.v.,
đóng cửa. Câu hỏi này không đáp ứng được hướng dẫn của Stack Overflow. Hiện tại câu hỏi này không chấp nhận câu trả lời. Chúng tôi không chấp nhận những câu hỏi tìm kiếm lời khuyên về sách, công cụ, thư viện phần mềm, v.v. Bạn có thể chỉnh sửa câu hỏi để có thể trả lời bằng các sự kiện và trích dẫn. Đã đóng cửa cách đây 7 năm.
Đã đóng. Câu hỏi này không đáp ứng được hướng dẫn của Stack Overflow. Hiện tại không chấp nhận câu trả lời. Các câu hỏi yêu cầu chúng tôi đề xuất hoặc tìm một công cụ, thư viện hoặc tài nguyên ngoài trang web yêu thích là không phù hợp với Stack Overflow vì
Tôi có một số mã C sẽ được gọi từ C# bằng cách sử dụng P/Invoke. Tôi đang cố gắng định nghĩa một hàm C# tương đương cho hàm C này. SomeData* DoSomething(); cấu trúc SomeData {
Câu hỏi này đã có câu trả lời: Tại sao các cấu trúc này lại sử dụng hành vi không xác định trước và sau khi tăng dần? (14 câu trả lời) Đã đóng 6
Tôi là một lập trình viên xuất sắc, rất giỏi!