導航:首頁 > 操作系統 > linuxcsocket多線程

linuxcsocket多線程

發布時間:2022-06-25 15:35:34

① vc 如何多線程處理CSocket數據

因為CSocket類要用到窗口的消息機制才能進行收發,所以用線程可以這樣用的,你可以參考用如下的方法:
CMySocket*
pSocket;
...
ThreadFunc(
)
{
pSocket
=
new
CSocket;
pSocekt->Create();
pSocket->Connect(...);
while(...)
{
MSG
msg;
Sleep(
5
);
if
(
::PeekMessage(&msg,
NULL,
NULL,
NULL,
PM_REMOVE
)
)
{
::TranslateMessage(
&msg
);
::DispatchMessage(
&msg
);
}
。。。
//線程的其他代碼
);
}
希望以上的代碼對你有用

linux中多個進程公用一個socket的問題

從設計上來說, 設計成多線程比較好,可以實現同時工作 (CUP 使用時間分片機制).至於套節字,分開來使用更簡單,通信雙方也能更好解析信息.如果要考慮共用一個套節字,需要使用互斥機制.

③ 剛介入linux c的socket編程沒多久,想要寫一個socket客戶端,實現多線程處理發送和接收,哪位大俠幫幫忙啊

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 8888

void *yourfunction(void *connect_fd)
{
int connfd = *((int *)connect_fd);
。。。。
} //你沒說具體的應用,所以只能寫這么多了。在這裡面直接對connfd調用read和write函數就可以和客戶端收發數據了。

//補充:是啊 返回給客戶端什麼信息啊?

int main(void)
{
int sockfd, n, connfd;
pthread_t tid;
struct sockaddr_in servaddr;

sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1)
{
perror("socket:");
exit(1);
}

bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(PORT);

n = bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
if (n == -1)
{
perror("bind:");
exit(1);
}

n = listen(sockfd, 20);
if (n == -1)
{
perror("listen:");
exit(1);
}

while (1)
{
connfd = accept(sockfd, (struct sockaddr *)&servaddr, NULL);
pthread_create(&tid, NULL, yourfunction, (void *)&connfd);
}

return 0;
}

④ linux c socket 如何實現一個進程多個線程,每個線程管理多個socket連接

大家仔細看,樓主的題目還是很有難度的呢,一個進程多個線程容易實現,但是要讓這些線程中每個線程都管理多個socket連接,確實比較難~~坐等高手。
不過一般都是一個線程處理一個socket連接,這種例子是:
(取自書上,僅供學習,直接編譯肯定通不過,少書上其他代碼)
==================================================
/* include serv06 */#include "unpthread.h"
intmain(int argc, char **argv)
{
int listenfd, connfd;
void sig_int(int);
void *doit(void *);
pthread_t tid;
socklen_t clilen, addrlen;
struct sockaddr *cliaddr;

if (argc == 2) listenfd = Tcp_listen(NULL, argv[1], &addrlen);
else if (argc == 3)
listenfd = Tcp_listen(argv[1], argv[2], &addrlen);
else
err_quit("usage: serv06 [ <host> ] <port#>");
cliaddr = Malloc(addrlen);

Signal(SIGINT, sig_int);
for ( ; ; ) { clilen = addrlen;
connfd = Accept(listenfd, cliaddr, &clilen);

Pthread_create(&tid, NULL, &doit, (void *) connfd); }
}

void *doit(void *arg)
{
void web_child(int);

Pthread_detach(pthread_self()); web_child((int) arg);
Close((int) arg);
return(NULL);
}
/* end serv06 */

voidsig_int(int signo)
{
void pr_cpu_time(void);

pr_cpu_time(); exit(0);
}
================================================================

⑤ linux socket編程 雙線程同時讀寫緩沖流時為什麼fprintf被阻塞了

你用fprintf讀寫socket?如果是,那麼應該改成send或者write因為fprintf第一個參數為FILE *而文件描述符的是int類型上就有問題。如果不是,那麼會不會兩個線程同時讀取一個socket介面,而當時數據正好被另一個線程所讀取,而導致一個線程所阻塞。

⑥ CSocket實現多線程通信的問題

我以前寫的多線程的伺服器

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <ctype.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>

#define MAXLINE 4096

fd_set allset, readyset;
int client[FD_SETSIZE];
int maxfd, max_client;
pthread_mutex_t work[3] = {PTHREAD_MUTEX_INITIALIZER};

void *gaa( void *arg )
{
char buf[MAXLINE];
int len, j, fd = *((int * )arg);
if ( read( fd, buf, MAXLINE ) )
{
pthread_mutex_lock( &work[0] );
printf( "receive form clinet %s", buf );
pthread_mutex_unlock( &work[0] );
len = strlen( buf );
for( j = 0; j < len; j++ )
buf[j] = toupper( buf[j] );

write( fd, buf, len + 1 );
}
else
{
pthread_mutex_lock( &work[1] );
printf( "fd close %d\n",fd );
pthread_mutex_unlock( &work[1] );
close( fd );
pthread_mutex_lock( &work[2] );
FD_CLR( fd, &allset );
*((int *)arg) = -1;
pthread_mutex_unlock( &work[2] );
}
return NULL;
}
void add_new_client( int sockfd )
{
struct sockaddr_in guest;
socklen_t len = sizeof( guest );
int fd, i;
char str[INET_ADDRSTRLEN];

fd = accept( sockfd, ( struct sockaddr * )&guest, &len );
printf( "receive from %s at port %d\n", inet_ntop( PF_INET, &guest.sin_addr, str, sizeof(str ) ),
ntohs( guest.sin_port ) );
FD_SET( fd, &allset );
if( fd > maxfd ) maxfd = fd;
for( i = 0; i < FD_SETSIZE; i++ )
if( client[i] == -1 )
{
client[i] = fd;
break;
}
if( i > max_client )
max_client = i;
}

void serve_client()
{
int i, fd, count = 0;
pthread_t pit[FD_SETSIZE];

for( i = 0; i < max_client; i++ )
{
if ( ( fd = client[i] ) == -1 )
continue;
if ( FD_ISSET( fd, &readyset ) )
{
pthread_create( &pit[i], NULL, gaa, (void *)&client[i] );
count++ ;
}
}
for( i = 0; i < count; i++ )
pthread_join( pit[i], NULL );
}
int main ()
{
struct sockaddr_in serv, guest;
int sockfd, confd;
int i, nready;

bzero( &serv, sizeof( serv ) );
serv.sin_family = PF_INET;
serv.sin_port = htons ( 8000 );
serv.sin_addr.s_addr = htonl( INADDR_ANY );

sockfd = socket( PF_INET, SOCK_STREAM, 0 );

bind( sockfd, ( struct sockaddr * )&serv, sizeof( serv ) );
listen( sockfd, 1024 );
printf( "Accepting connection.......\n" );

FD_ZERO( &allset );
FD_SET( sockfd, &allset );
maxfd = sockfd;
for( i = 0; i < 1024; i++ )
client[i] = -1;
max_client = -1;

while ( 1 )
{
readyset = allset;
nready = select( maxfd + 1, &readyset, NULL, NULL, NULL );
if( FD_ISSET( sockfd, &readyset ) )
{
add_new_client( sockfd );
nready--;
}
if( nready )
serve_client();
}
return 0;
}

看看對你有幫助嗎

⑦ linux c後端 socket服務線程怎麼變成一直運行在後台的線程服務,讓它跟著整個程序生命周

寫成服務,加到開機啟動腳本下面,簡單的直接寫個腳本放到/etc/init.d, 實現start stop restart
也可以寫守護進程

⑧ linux下的 socket編程問題!

第一個問題:

對,是那樣的,用open打開文件,用read讀取文件,在發送給對方,接收方接收到後,寫入文件就可以了。不過在這個過程中最好別用字元串函數,除非你很熟悉。

第二個問題

首先你得去搞清楚什麼是線程,什麼是進程,fork出來的叫進程,pthread_create出來的才叫線程。伺服器有很多種模型(多進程,多線程,select,epoll模型,這個我的blog上有,famdestiny.cublog.cn),不一定要用多進程。

給你寫了個代碼,自己先看看:

注意,在自己的目錄下創建一個叫pserverb的文件,程序會把這個文件復製成test文件。你可以自己根據需要改改

server:

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#define SERV_PORT 5358
#define MAX_CONN 10
#define BUF_LEN 1024

void str_echo(FILE *fp, int sockfd){
ssize_t nread;
int file_fd;
char buf[BUF_LEN] = {0};

file_fd = open("test", O_WRONLY | O_TRUNC | O_CREAT, 0755);
while(1) {
bzero(buf, BUF_LEN);
if((nread = read(sockfd, buf, BUF_LEN)) == -1) {
if(errno == EINTR) {
continue;
}
else {
printf("readn error: %s\n", strerror(errno));
continue;
}
}
else if (nread == 0) {
break;
}
else {
printf("%s\n", buf);
write(file_fd, buf, nread);
}
}
close(file_fd);
}

void sig_chld(int sig){
pid_t pid;
int state;
while((pid = waitpid(-1, &state, WNOHANG)) > 0){
printf("child process %d exited.", pid);
}
return;
}

int main(int argc, char **argv)
{
int listenfd, connfd;
socklen_t cliaddrlen;
pid_t childpid;
struct sockaddr_in servaddr, cliaddr;

if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
printf("socket error: %s\n", strerror(errno));
return 0;
}

bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
if(bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1){
printf("bind error: %s\n", strerror(errno));
return 0;
}

if(listen(listenfd, MAX_CONN) == -1){
printf("listen error: %s\n", strerror(errno));
return 0;
}

signal(SIGCHLD, sig_chld);

while(1){
cliaddrlen = sizeof(cliaddr);
if((connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddrlen)) == -1){
if(errno == EINTR){
continue;
}
else{
printf("accept error: %s\n", strerror(errno));
continue;
}
}

if((childpid = fork()) == 0){
close(listenfd);
str_echo(stdin, connfd);
exit(0);
}
else if(childpid > 0){
close(connfd);
}
else{
printf("fork error!\n");
continue;
}
}
}

client:

#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

#define SERV_ADDR "127.0.0.1"
#define SERV_PORT 5358
#define BUF_LEN 1024

void str_cli(char *path, int sockfd)
{
char sendbuf[BUF_LEN] = {0};
int fd, n;

if((fd = open("./pserverb", O_RDONLY)) == -1){
printf("%s\n", strerror(errno));
exit(0);
}
while((n = read(fd, sendbuf, BUF_LEN)) != 0) {
if(n < 0){
printf("%s\n", strerror(errno));
exit(0);
}
write(sockfd, sendbuf, n);
bzero(sendbuf, BUF_LEN);
}
close(fd);
return;
}

int main(int argc, char **argv)
{
int fd;
struct sockaddr_in servaddr;

fd = socket(AF_INET, SOCK_STREAM, 0);

bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr(SERV_ADDR);
servaddr.sin_port = htons(SERV_PORT);

if (connect(fd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) {
printf("connect error: %s\n", strerror(errno));
return 0;
}

str_cli(argv[1], fd);
return 0;
}

⑨ linux中socket怎麼實現同時收發數據,在我的系統中,需要向伺服器發送數據,伺服器也要向客戶度發數據

可以的 線程是共享內存空間的 因此在使用多線程的情況下,要做好線程同步的工作,要對
不同線程訪問的內存數據進行加鎖處理

⑩ CSocket類和多線程

如果m_client是CMyDlg的成員的話,得到dlg的指針自然可以得到成員了;
這里需要注意的是MFC的很多對象都有不是線程安全的,特別是窗口對象,
如果只是通過窗口指針使用成員不會有問題,但是CSocket也不是線程安全的。
》》》》補充:
最好是將CSocket及dlg相關操作放在dlg內部,通過消息機制觸發,
例如dlg中增加自定義消息函數sendData
線程中適當的時候向窗口發送自定義消息觸發sendData,
其中,sendData函數如果涉及到共用數據結構的讀寫,自己保證線程同步。

閱讀全文

與linuxcsocket多線程相關的資料

熱點內容
java布局實例 瀏覽:626
51單片機頻率計的 瀏覽:27
帶伺服器的電腦怎麼用 瀏覽:999
什麼app可以調整手機幀率 瀏覽:315
說苑pdf 瀏覽:874
安裝包加密有什麼用 瀏覽:584
舍利子靈力演算法 瀏覽:501
javacalendar天數 瀏覽:567
anyview閱讀器java 瀏覽:361
怎麼降為安卓10 瀏覽:996
javaweb程序設計郭 瀏覽:249
gm聲望命令 瀏覽:486
pdf轉換器電腦版免費 瀏覽:43
解壓歌曲什麼歌最好 瀏覽:153
諾貝爾pdf 瀏覽:969
雲伺服器快速安裝系統原理 瀏覽:790
蘋果騰訊管家如何恢復加密相冊 瀏覽:118
手機軟體反編譯教程 瀏覽:861
sqlserver編程語言 瀏覽:650
gpa國際標准演算法 瀏覽:238