- 论坛徽章:
- 0
|
已解决,问题是应该在客户端线程中connect
客户端有多个线程向服务器发请求,但只能返回一个结果,或一个结果都不返回。
服务器端预先创建多个线程,各个线程各自accept。代码如下,请大家看看哪里出错了。
服务器端代码:
- //服务线程
- void *serviceThread(void *arg)
- {
- if (pthread_detach(pthread_self()) != 0) {
- g_Log.writeLog(FA, "Thread Detach Error...");
- exit(-1);
- }
- g_Log.writeLog(D1, "new Service Thread");
- int listenfd = *(int *)arg;
- int connfd;
- socklen_t clilen;
- struct sockaddr cliaddr;
- for ( ; ; ) {
- clilen = sizeof(cliaddr);
- pthread_mutex_lock(&g_acptLock);
- connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen);
- if (connfd < 0) {
- g_Log.writeLog(ER, "Accept Error...");
- pthread_mutex_unlock(&g_acptLock);
- continue;
- }
- pthread_mutex_unlock(&g_acptLock);
- doService(connfd);
- close(connfd);
- }
- return NULL;
- }
- void doService(int &sockfd)
- {
- for ( ; ; ) {
- //从sockfd读数据,处理后,向sockfd写数据
- }
- }
复制代码
客户端代码:
- int main(int argc, char **argv)
- {
- // init Log
- if(g_Log.init("./logs", "dnsLog", 10485760, 1) < 0){
- cerr << "Init log error!" << endl;
- exit(-1);
- };
- int sockfd;
- struct sockaddr_in servaddr;
- if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
- cerr << "Socket Error" << endl;
- exit(-1);
- }
-
- bzero(&servaddr, sizeof(servaddr));
- servaddr.sin_family = AF_INET;
- servaddr.sin_port = htons(8002);
- if(inet_pton(AF_INET, "****", &servaddr.sin_addr) != 1) {
- cerr << "inet_pton error" << endl;
- exit(-1);
- }
- if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) {
- cerr << "Connect Error" << endl;
- exit(-1);
- }
- uint32_t thrdNum = 10;
- pthread_t threads[thrdNum];
- for (uint32_t i = 0; i < thrdNum; i++) {
- if (pthread_create(&threads[i], NULL, &requestIP, (void *)&sockfd) != 0) {
- cerr << "Thread Create Error..." << endl;
- exit(-1);
- }
- }
- for ( ; ; )
- pause();
- return 0;
- }
- void *requestIP(void *arg)
- {
- //向sockfd写数据,然后接收数据
- }
复制代码
[ 本帖最后由 litao19 于 2008-7-24 15:52 编辑 ] |
|