导航:首页 > 操作系统 > 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多线程相关的资料

热点内容
安装包加密有什么用 浏览:580
舍利子灵力算法 浏览:497
javacalendar天数 浏览:561
anyview阅读器java 浏览:359
怎么降为安卓10 浏览:994
javaweb程序设计郭 浏览:247
gm声望命令 浏览:484
pdf转换器电脑版免费 浏览:41
解压歌曲什么歌最好 浏览:151
诺贝尔pdf 浏览:967
云服务器快速安装系统原理 浏览:788
苹果腾讯管家如何恢复加密相册 浏览:115
手机软件反编译教程 浏览:858
sqlserver编程语言 浏览:650
gpa国际标准算法 浏览:238
服务器编程语言排行 浏览:947
怎么下载快跑app 浏览:966
小红书app如何保存视频 浏览:172
如何解开系统加密文件 浏览:811
linux切换root命令 浏览:283