- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试让程序运行多个线程以连接到不同的端口。我成功地让它在单个线程上工作,但不能在多个线程上工作。
下面我发布了我在 XUbuntu 上使用的代码。
服务器.c
#include <stdio.h>
#include <netdb.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
// File io storing in lof file
#include "server_portLog.h"
// Thread used to create sockets
#include "sockets_pthread.h"
#define BUFFER_SIZE 1024
int main(int argc, char *argv[]) {
// Server port number
//int portNumber = atoi(argv[1]);
// sockfd: ip-address socket, newsockfd: socket from receiving client, portNum: Which port will be listening, num_bytes: received data from client
int sockfd, newsockfd, num_bytes;
// buffer: will send & receive values from the server
char buffer[BUFFER_SIZE];
struct sockaddr_in serv_addr, cli_addr;
socklen_t clilen = sizeof(cli_addr);
// Getting all ports from command line parameters and creating a socket for each
int numPorts = argc - 1;
struct port varPorts[numPorts];
pthread_t portsSockets[numPorts];
for (int i = 0; i < numPorts; i++) {
varPorts[i].portNumber = atoi(argv[i + 1]);
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_create(&portsSockets[i], &attr, createSocket, &varPorts[i]);
}
// Infinite loop too keep listening even after connection to client closes
while (1) {
// After that all the ports entered have a socket of their own the program runs them parallel together to see if any client tries to connect with one of the ports
for (int i = 0; i <= numPorts; i++) {
pthread_join(&portsSockets[i], NULL);
/* Start listening for the clients (thread blocks) */
if (listen(varPorts[i].sockfd, 5) != 0) {
printf("Error: listen() failed for port: %d \n", varPorts[i].portNumber);
//return 3;
}
// Accepting connection from client & creating socket with that client data
newsockfd = accept(varPorts[i].sockfd, (struct sockaddr *)&cli_addr, &clilen);
if (newsockfd < 0) {
printf("Error: accept() failed for port: %d \n", varPorts[i].portNumber);
//return 4;
}
/* To send receive data */
// Clearing buffer
memset(buffer, 0, BUFFER_SIZE);
// Show data received from client
num_bytes = recv(newsockfd, buffer, BUFFER_SIZE-1, 0);
if (num_bytes < 0) {
printf("Error: recv() failed for port: %d \n", varPorts[i].portNumber);
//return 5;
}
// Checking version of server if LOGFILE it creates a file to store the ports
#if defined LOGFILE
// Checking if user wrote a fileName for the logs or going to use the default log file
if (argc == 3) {
char *textFile = argv[argc-1];
serverLogFile_Custom(buffer, textFile);
}
else {
serverLogFile_Defualt(buffer);
}
#else
// Print the port numbers that connect to server
printf("Received: Client using port- %s to connect \n", buffer);
#endif
// Closing connection with client
close(newsockfd);
}
}
return 0;
}
Sockets_pthreads.h
#include <pthread.h>
struct port {
int portNumber;
int sockfd;
};
void* createSocket(void* portNumber) {
// sockfd: ip-address socket, newsockfd: socket from receiving client, portNum: Which port will be listening, num_bytes: received data from client
int sockfd, newsockfd, num_bytes;
// buffer: will send & receive values from the server
//char buffer[BUFFER_SIZE];
struct sockaddr_in serv_addr, cli_addr;
socklen_t clilen = sizeof(cli_addr);
struct port *portStruct = (struct port*) portNumber;
// Creating a new socket with ip-Protocol_tcp
// Parameters: Internet-domain, socket-stream, TCP-protocol
sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sockfd < 0) {
printf("Error: Failed to open socket for port: %d \n", portStruct->portNumber);
//return 1;
}
// Setting all bits in padding-field to 0
memset(&serv_addr, 0, sizeof(serv_addr));
// Initializing socket in sockaddr_in (stucture)
serv_addr.sin_family = AF_INET; // Seting family-Internet
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(portStruct->portNumber); // Setting portNum (passed in command line)
// Binding the address-structure to the socket
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
printf("Error: bind() failed for port: %d \n", portStruct->portNumber);
//return 2;
}
// Geting sockfd
portStruct->sockfd = sockfd;
pthread_exit(0);
}
最佳答案
问题不清楚需要执行什么。如果各种端口套接字必须接受,那么它必须发生在线程函数以及 recv 调用中。在服务器函数中有默认情况下阻塞的 accept 和 recv 调用。
关于XUbuntu 上的 C 多线程编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54282449/
我想为项目禁用 xubuntu 机器上的切换窗口弹出窗口(alt+tab)。有没有人已经做到了这一点,你采取了哪些步骤? 到目前为止,我只能更改弹出窗口的布局和样式,但我无法完全停用它。 谢谢。 最佳
etc/apache2/sites-available我网站的文件有一个错误日志的位置,设置如下: ${APACHE_LOG_DIR}/error.log 问题是我不知道 APACHE_LOG_DIR
我管理着数百台安装了 Xubuntu 的计算机。我想将默认文件管理器从 Thunar 切换到 Nemo(两者都已安装)。 启动 exo-preferred-applications 并使用对话框很容易
使用 bash,我一直在尝试在 Nemo (3.8.6) 文件管理器的窗口装饰 xfwm4(窗口标题旁边)中添加和显示一个简单的旋转器动画。我正在使用带有基本 Greybird 主题的 Xubuntu
我曾经有两种键盘布局捷克语和英语。但是当我想从另一个键盘布局中输入任何字符时,我不想改变整个布局。所以我喜欢按,同时按布局切换。另一方面,当我写更长的文本时,我想切换布局 如何实现双键切换键盘布局?
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为
我正在使用 UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 在 try-catch block 中,以确保我的
我正在我的 Linux 机器上设置一个虚拟主机,我遵循了所有的步骤和指南,但由于某种原因我没有去我的网站。我安装了 LAMP,apache、mysql、php 都可以正常工作。我在 phpmyadmi
我正在尝试让程序运行多个线程以连接到不同的端口。我成功地让它在单个线程上工作,但不能在多个线程上工作。 下面我发布了我在 XUbuntu 上使用的代码。 服务器.c #include #includ
我知道这个问题被问了很多,但我找不到适合我情况的答案。我的代码中没有指针,但我遇到了这个问题。我的程序旨在分解一个数字,尽管我无法测试运行该程序。我使用 Ubuntu 16.04 和 xfce,所以实
有没有办法找出什么进程或什么正在填满内存?我刚写了一个程序,似乎很快就把它填满了,之后就不再释放了。 提前致谢! 最佳答案 使用 top 或 htop(更好的 View )。 关于memory - 程
我在我的 PC(12.04,Precise Pangolin)上安装了 xubuntu OS,并使用 ubuntu 的二进制存储库安装了 C++ boost lib(1.49),方法是在终端中发出以下
我一直在努力在 xubuntu 上设置 android studio。我可以在终端上手动找到设备,但是当我在 Android Studio 上运行应用程序时,我会让 ADB 等到它停止响应。 感谢您的
我正在尝试将文件放入目录(系统属性user.home)/.plantgrower/logs中。文件夹 .myprogram 不存在,我想创建它及其子文件夹。这是我的代码: File f = new F
我安装了 Xubuntu 12.04,我想用它来运行商业程序。商业程序在启动时运行一个脚本来检查分发。如果它像 Ubuntu 一样受支持,那么没问题,但如果它看到 Xubuntu,它就会提示该平台。有
我有一个 python3.2 脚本,应该在完成所有操作后删除一个文件夹: def perforce_backup( source, destination, tmp_location, zip_tmp
桌面插件区域的保管箱图标不见了,取而代之的是一台黑色电视 1在它的中心有一个红色的标志。我试图通过删除并重新安装保管箱并遵循建议的解决方案来解决此问题 here .一种解决方案和另一种解决方案都没有解
根据标题,我只是想在 ubuntu 中为 php 安装 pecl_http 扩展。 所以我做了最有意义的事情: andreas@earl ~ $ sudo pecl install pecl_http
一点背景知识:我对 GO 和 QML 非常陌生。我一直在互联网上仔细阅读有关它们的主要原因是因为我正在尝试构建 Sublime Text 克隆 Lime Text。我在 Xubuntu 13.10 上
这是一个循序渐进的初学者教程,展示了如何在 Xubuntu 和其他使用 Xfce 桌面环境的 Linux 发行版中安装主题和图标。 在 Xubuntu 上安装主题与
我是一名优秀的程序员,十分优秀!