當前位置:首頁 » 操作系統 » linux多線程socket

linux多線程socket

發布時間: 2022-09-30 21:57:03

A. 請教linux下socket編程中send函數如何強制其將數據發出去

在多線程編程中其中使用一個線程來accept要連接的客戶端。同時在接受client的請求之後新建一個線程來進行具體的操作。其操作包括向client端發送一定位元組的數據,使用send()函數來進行操作。如果在發送過程中出現任何一個client端的斷線,則整個程序都會退出。
ssize_t send(int sockfd, const void *buff, size_t nbytes, int flags);
關於Linux命令的介紹,看看《linux就該這么學》,具體關於這一章地址3w(dot)linuxprobe/chapter-02(dot)html

上面為send函數原型,在通常的使用中flags參數一般設置為0.此時如果客戶端斷開,繼續往裡邊寫數據的話,會引發一個信號SIGPIPE,此信號會引發線程的退出、
解決的方法:1)可以將flags參數設置為MSG_NOSIGNAL。2)設置SIG_IGN信號處理函數。

B. linux下socket編程,只需要實現伺服器端能接收多個用戶端發來的消息這個功能就行,求代碼,最好有相應解釋

這些都是自己寫的,由於我很粗心調試了好久,要是有任何問題我都可以幫你解決,包教會,而且可以進一步一起完善他的功能

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<sys/time.h>

#define BUFF_SIZE 1024
#define PORT 8888
#define LSN_NUM 10

int main()
{
int sockfd = -1;
int clt_sockfd = -1;
int i = 0, fd;
fd_set inset, tmp_inset;
struct sockaddr_in *server_addr, *client_addr;
int addr_len = sizeof(struct sockaddr_in);
int len;
char buff[BUFF_SIZE];

if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 1){
printf("Create socket error!\n");
exit(0);
}else{
printf("Create socket success! sockfd = %d\n", sockfd);
}

server_addr = malloc(addr_len);
client_addr = malloc(addr_len);
memset(server_addr, 0, sizeof(server_addr));
memset(client_addr, 0, sizeof(client_addr));
server_addr->sin_family = AF_INET;
server_addr->sin_port = htons(PORT); //此處要將主機位元組序轉為網路位元組序
server_addr->sin_addr.s_addr = INADDR_ANY;
if(bind(sockfd, (struct sockaddr*)server_addr, sizeof(struct sockaddr_in)) < 0){
printf("Bind error!\n");
exit(0);
}else{
printf("Bind success!\n");
}

if(listen(sockfd, LSN_NUM) < 0){
printf("Listen error!\n");
exit(0);
}else{
printf("Listen success!\n");
}

printf("Waiting for connect ...\n");

i = 1;
FD_ZERO(&inset);
FD_SET(sockfd, &inset);
while(1){
printf("------ The %dth turning ------- \n", i++);
tmp_inset = inset;
memset(buff, 0, BUFF_SIZE);
//select
if(select(FD_SETSIZE, &tmp_inset, NULL, NULL, NULL) <= 0){
printf("Select failed!\n");
exit(0);
}else{
printf("Select success!\n");
}//end select
for(fd = 0; fd < FD_SETSIZE; fd++){
if(FD_ISSET(fd, &tmp_inset) > 0){
printf("crrent fd: %d\n", fd);
if(sockfd == fd){
if((clt_sockfd = accept(sockfd, (struct sockaddr*)client_addr, &addr_len)) < 0){
printf("Accept error!\n");
exit(0);
}else{
printf("Get connection from %s, port: %d. socket: %d\n", \
inet_ntoa(client_addr->sin_addr), ntohs(client_addr->sin_port), clt_sockfd);
}
FD_SET(clt_sockfd, &inset);
}else{
if((len = recv(fd, buff, BUFF_SIZE, 0)) < 0){
printf("Recv failed!\b");
close(fd);
FD_CLR(fd, &inset);
}else if(0 == len || !strncmp("quit", buff, 4)){
printf("Clt_sockfd %d has quited!\n", clt_sockfd);
close(fd);
FD_CLR(fd, &inset);
continue;
}else{
printf("Clt_sockfd %d got message: %s\n", clt_sockfd, buff);
}
}
}
}
continue;
}
}
free(server_addr);
free(client_addr);

}

C. linux下 socket多線程 socket泄露問題

把接收輸入的read函數改成recv試試。socket通信最好用recv。

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

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

E. Linux 進程間通信方式有哪些

進程間通信(IPC,Interprocess
communication)是一組編程介面,讓程序員能夠協調不同的進程,使之能在一個操作系統里同時運行,並相互傳遞、交換信息。這使得一個程序能夠在同一時間里處理許多用戶的要求。因為即使只有一個用戶發出要求,也可能導致一個操作系統中多個進程的運行,進程之間必須互相通話。IPC介面就提供了這種可能性。每個IPC方法均有它自己的優點和局限性,一般,對於單個程序而言使用所有的IPC方法是不常見的。
1、無名管道通信
無名管道(pipe):管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關系的進程間使用,進程的親緣關系通常是指父子進程關系。
2、高級管道通信
高級管道(popen):將另一個程序當做一個新的進程在當前程序進程中啟動,則它算是當前程序的子進程,這種方式我們稱為高級管道方式。
3、有名管道通信
有名管道(named pipe):有名管道也是半雙工的通信方式,但是它允許無親緣關系進程間的通信。
4、消息隊列通信
消息隊列(message
queue):消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識,消息隊列克服了信號傳遞信息少、管道只能承載無格式位元組流以及緩沖區大小受限等缺點。
5、信號量通信
信號量(semophore):信號量是一個計數器,可以用來控制多個進程對共享資源的訪問,它常作為一種鎖機制,防止某進程正在訪問共享資源時,其他進程訪問該資源。因此,主要作為進程間以及同一進程內不同線程之間的同步手段。
6、信號
信號(sinal):信號是一種比較復雜的通信方式,用於通知接收進程某個事件已經發生。
7、共享內存通信
共享內存(shared
memory):共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的IPC方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號量,配合使用,來實現進程間的同步和通信。
8、套接字通信
套接字(socket):套接字也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同機器間的進程通信。

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

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

G. 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);
}
================================================================

H. linux線程之間不能共享使用socket嗎

伺服器開兩個線程,一個監聽udp(bind函數,recvfrom函數),一個監聽tcp(bing函數,listen函數,accept函數),來一個客戶端請求,就再建立一個線程實現相應操作。

I. Windows Socket和Linux Socket編程的區別 ZZ

socket相關程序從Windows移植到Linux下需要注意的:
1)頭文件
Windows下winsock.h/winsock2.h
Linux下sys/socket.h
錯誤處理:errno.h
2)初始化
Windows下需要用WSAStartup
Linux下不需要
3)關閉socket
Windows下closesocket(...)
Linux下close(...)
4)類型
Windows下SOCKET
Linux下int
如我用到的一些宏:
#ifdef WIN32
typedef int socklen_t;
typedef int ssize_t;
#endif
#ifdef __Linux__
typedef int SOCKET;
typedef unsigned char BYTE;
typedef unsigned long DWORD;
#define FALSE 0
#define SOCKET_ERROR (-1)
#endif
5)獲取錯誤碼
Windows下getlasterror()/WSAGetLastError()
Linux下errno變數
6)設置非阻塞
Windows下ioctlsocket()
Linux下fcntl() <fcntl.h>
7)send函數最後一個參數
Windows下一般設置為0
Linux下最好設置為MSG_NOSIGNAL,如果不設置,在發送出錯後有可 能會導致程序退出。
8)毫秒級時間獲取
Windows下GetTickCount()
Linux下gettimeofday()
3、多線程
多線程: (win)process.h --〉(Linux)pthread.h
_beginthread --> pthread_create
_endthread --> pthread_exit
一、linux下的socket編程:
1、客戶端執行步驟依次如下:
socket()
connect()
send()或者recv()
close()
注意的是,connect之前要填充地址結構體,IP地址轉換為網路位元組序,一般用inet_aton().
2、伺服器端:
socket()
bind()
listen()
accpet()
recv()或者send()
close()
(ps:一般通過將send()和recv()的最後一個參數賦為0或者1來區分阻塞與非阻塞,其中0對應阻塞,1對應非阻塞)
二、windows下的網路編程:
做過windows網路編程的人都知道,微軟的MFC把復雜的WinSock API函數封裝到類里,這使得編寫網路應用程序更容易。即windows既提供上層的網路API函數也提供底層的API函數。
1、對於採用上層的API函數而言:若採用csocket類定義一個對象obj的話,那麼進行網路編程的步驟如下:
客戶端:
obj.Create()
obj.Connect()
obj.Receive()或者obj.Send()
obj.Close()
伺服器端:
先調用AfxSocketInit()檢測協議棧安裝情況
obj.Create()
obj.Listen()
obj.Accpet()
obj.Receive()或者obj.Send()
obj.Close()
2、對於採用底層的API函數而言,步驟如下:
客戶端:
WSAStartup()
socket()
connect()
send()或者recv()
closesocket()
伺服器端:
WSAStartup()
socket()
bind()
listen()
accpet()
send()
recv()
closesocket()
(ps:windows下CSocket類為同步方式,有阻塞現象;CASyncSocket為非同步方式,無阻塞現象。)
通過以上比較可以發現:linux下的網路編程與windows下採用底層的API類似,但是也有區別:
區別一:windows下需加上WSAStartup()函數
區別二:關閉socket:linux為close(),windows為closesocket()
windows下採用上層的API,一般有CSocket和CAsynSocket這兩種類型的類
這種情況以下socket函數一般的首字母大寫。而底層的API不管是windows下的還是linux下的socket函數首字母都是小寫的。

熱點內容
蟻周演算法 發布:2025-07-15 04:34:28 瀏覽:599
電腦伺服器名稱寫什麼 發布:2025-07-15 04:29:53 瀏覽:430
安卓編譯打包 發布:2025-07-15 04:24:20 瀏覽:169
bat編譯器 發布:2025-07-15 04:18:07 瀏覽:54
中興伺服器登錄地址 發布:2025-07-15 04:02:47 瀏覽:988
手提箱怎麼改密碼 發布:2025-07-15 03:55:47 瀏覽:219
did腳本 發布:2025-07-15 03:55:12 瀏覽:963
殘留溶劑線性濃度如何配置 發布:2025-07-15 03:54:31 瀏覽:134
部落沖突好號密碼是什麼 發布:2025-07-15 03:48:45 瀏覽:971
存儲氣瓶 發布:2025-07-15 03:48:10 瀏覽:992